Подтвердить что ты не робот

Использование Html.ActionLink и Url.Action(...) изнутри контроллера

Я хочу написать 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>

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

4b9b3361

Ответ 1

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

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