Вопрос

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

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

Это было полезно?

Решение

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

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

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

var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top