12

Я хочу написать HtmlHelper для рендеринга ActionLink с заданными значениями, например.Использование Html.ActionLink и Url.Action (...) изнутри контроллера

<%=Html.PageLink("Page 1", "page-slug");%> 

где PageLink это функция, которая вызывает ActionLink с известными действиями и контроллером, например. «Индекс» и «Страница».

С HtmlHelper и UrlHelper не существует внутри Controller или класса, как получить относительный URL-адрес для действия внутри класса?

Обновление: Учитывая дополнительные три года накопленного опыта у меня сейчас, вот мой совет: просто использовать Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) или еще лучше,

<a href="@Url.Action("ViewPage", 
        new { 
          controller = "Page", 
          slug = "my-page-slug" })">My Link</a> 

Ваш метод расширения может быть мило и короткая, но это добавляет еще одна непроверенная точка отказа и новое требование к обучению для найма, не добавляя никакой реальной ценности вообще. Подумайте об этом как о разработке сложной системы. Зачем добавлять другую движущуюся часть, если только она не добавляет надежности (нет), читаемости (мало, как только вы читаете больше docs), скорость (нет) или параллелизм (нет).

+0

+1 для уточнения. Я бы также указал будущим искателям на этот вопрос при вызове 'Url.Action' изнутри контроллера - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins

ответ

20

Не уверен, что я действительно четко понял ваш вопрос, но, позвольте мне попробовать.

Чтобы создать расширение HtmlHelper, как вы описали, попробовать что-то вроде:

using System; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace Something { 
    public static class PageLinkHelper 
    { 
     public static string PageLink(
      this HtmlHelper helper, 
      string linkText, string actionName, 
      string controllerName, object routeValues, 
      object htmlAttributes) 
     { 
      return helper.ActionLink(
       linkText, actionName, controllerName, 
       routeValues, htmlAttributes); 
     } 
    } 
} 

Что касается вашего вопроса о получении URL из класса, в зависимости от того, какой класс вы будете реализовывать его. Например, если вы хотите, чтобы получить текущий контроллер и действие с расширением HtmlHelper, вы можете использовать:

string currentControllerName = (string)helper.ViewContext 
    .RouteData.Values["controller"]; 
string currentActionName = (string)helper.ViewContext 
    .RouteData.Values["action"]; 

Если вы хотите получить его от контроллера, вы можете использовать свойства/методы из базового класса (Controller) для создания URL-адреса. Например:

var url = new UrlHelper(this.ControllerContext.RequestContext); 
url.Action(an_action_name, route_values); 
+1

Отлично ответ. Я пробовал это без обертывания в статическом классе, и он не регистрировал бы helper.ActionLink (...). Благодарю. –

+0

А, и я не импортировал System.Web.Mvc; Виноват. –

Смежные вопросы