Генерировать 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 ответа:
вы можете создать 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 только для справки)