net mvc htmlhelper custom asp asp.net-mvc url html-helper

asp.net mvc - mvc - Generar URL en HTML helper



asp net mvc custom html helper (3)

Normalmente, en una vista de ASP.NET se puede usar la siguiente función para obtener una URL (no un <a> ):

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

Sin embargo, no puedo encontrar la forma de hacerlo desde un helper HTML personalizado. yo tengo

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

La variable auxiliar tiene los métodos Action y GenerateLink, pero generan <a> . Hice algunas excavaciones en el código fuente de ASP.NET MVC, pero no pude encontrar una manera directa.

El problema es que la URL anterior es miembro de la clase de vista y para su creación de instancias necesita algunos contextos y mapas de ruta (con los que no quiero estar tratando y de todos modos no se supone que deba hacerlo). Alternativamente, la instancia de la clase HtmlHelper también tiene algún contexto que supongo que es una cena del subconjunto de la información de contexto de la instancia de Url (pero de nuevo no quiero tratar con ella).

En resumen, creo que es posible, pero dado que todas las formas que pude ver implican cierta manipulación con algunas cosas más o menos internas de ASP.NET, me pregunto si existe una forma mejor.

Editar: Por ejemplo, una posibilidad que veo sería:

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

Pero no parece correcto. No quiero tratar con instancias de UrlHelper yo mismo. Debe haber una manera más fácil.


Aquí está mi pequeño método de extensión para obtener UrlHelper de una instancia de 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]; } }

Úselo como:

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

(Estoy publicando esta ans solo como referencia)


Puedes crear url helper como este dentro del método de extensión html helper:

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


También puede obtener enlaces usando UrlHelper public y static class:

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

En este ejemplo, no es necesario crear una nueva clase UrlHelper, lo que podría ser una pequeña ventaja.