Использование Html.ActionLink и Url.Action (...) внутри контроллера - PullRequest
12 голосов
/ 11 апреля 2010

Я хочу написать HtmlHelper для рендеринга ActionLink с предустановленными значениями, например.

<%=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>

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

1 Ответ

20 голосов
/ 11 апреля 2010

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

Чтобы создать расширение 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);
...