Генерация URL в HTML помощник - PullRequest
       31

Генерация URL в HTML помощник

167 голосов
/ 18 сентября 2009

Обычно в представлении ASP.NET можно использовать следующую функцию для получения URL-адреса (не <a>):

Url.Action("Action", "Controller");

Однако я не могу найти, как это сделать с помощью специального помощника HTML. У меня

public class MyCustomHelper
{
   public static string ExtensionMethod(this HtmlHelper helper)
   {
   }
}

Вспомогательная переменная имеет методы Action и GenerateLink, но они генерируют <a>. Я немного покопался в исходном коде ASP.NET MVC, но не смог найти прямой путь.

Проблема заключается в том, что указанный выше URL-адрес является членом класса представления, и для его создания ему необходимы некоторые контексты и карты маршрутов (с которыми я не хочу иметь дело, и в любом случае я не должен). В качестве альтернативы, экземпляр класса HtmlHelper также имеет некоторый контекст, который, как я полагаю, является либо ужином подмножества контекстной информации экземпляра Url (но, опять же, я не хочу иметь с ним дело).

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

Редактировать: Например, я вижу одну возможность:

public class MyCustomHelper
{
    public static string ExtensionMethod(this HtmlHelper helper)
    {
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        urlHelper.Action("Action", "Controller");
    }
}

Но это не кажется правильным. Я не хочу иметь дело с примерами UrlHelper сам. Должен быть более простой способ.

Ответы [ 3 ]

213 голосов
/ 18 сентября 2009

Вы можете создать url helper следующим образом в методе расширения html helper:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")
21 голосов
/ 24 января 2013

Вы также можете получить ссылки, используя UrlHelper открытый и статический класс:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)

В этом примере вам не нужно создавать новый класс UrlHelper, что может быть небольшим преимуществом.

10 голосов
/ 29 мая 2013

Вот мой крошечный метод расширения для получения UrlHelper экземпляра HtmlHelper:

  public static partial class UrlHelperExtensions
    {
        /// <summary>
        /// Gets UrlHelper for the HtmlHelper.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <returns></returns>
        public static UrlHelper UrlHelper(this HtmlHelper htmlHelper)
        {
            if (htmlHelper.ViewContext.Controller is Controller)
                return ((Controller)htmlHelper.ViewContext.Controller).Url;

            const string itemKey = "HtmlHelper_UrlHelper";

            if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null)
                htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

            return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey];
        }
    }

Используйте это как:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, )
{    
    var url = htmlHelper.UrlHelper().RouteUrl('routeName');
    //...
}

(я публикую этот ответ только для справки)

...