Генерировать URL-адреса в HTML-хелпер


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

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

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

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

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

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

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

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

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

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

3 163

3 ответа:

вы можете создать url helper, как это внутри html helper метод расширения:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")

вы также можете получить ссылки через UrlHelper public и static класс:

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

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

вот мой крошечный метод расширения для получения 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');
    //...
}

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