12

Deseo escribir un HtmlHelper para representar un ActionLink con valores preestablecidos, por ej.Uso de Html.ActionLink y Url.Action (...) desde el interior del controlador

<%=Html.PageLink("Page 1", "page-slug");%> 

donde PageLink es una función que llama a ActionLink con una acción conocida y el controlador, por ejemplo. "Índice" y "Página".

Dado que HtmlHelper y UrlHelper no existen dentro de una clase Controller, ¿cómo obtengo la URL relativa a una acción desde dentro de una clase?

Actualización: Teniendo en cuenta los tres años adicionales de experiencia acumulada que tengo ahora, aquí es mi consejo: sólo tiene que utilizar Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) o mejor aún,

<a href="@Url.Action("ViewPage", 
        new { 
          controller = "Page", 
          slug = "my-page-slug" })">My Link</a> 

Su método de extensión puede ser lindo y corto, pero se suma otro punto-de-fracaso no probado y un nuevo requisito de aprendizaje para las contrataciones sin agregar ningún valor real de ningún tipo. Piense en ello como el diseño de un sistema complejo. Por qué agregar otra parte móvil, a menos que agregue confiabilidad (no), legibilidad (poco, una vez que lea más documentos), velocidad (ninguna) o concurrencia (ninguna).

+0

+1 para la actualización. También señalaría a los buscadores futuros a esta pregunta al llamar 'Url.Action' desde dentro del controlador - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins

Respuesta

20

No estoy seguro si entendí tu pregunta claramente, pero, déjame intentarlo.

Para crear una extensión HtmlHelper como usted describió, intentar algo como:

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); 
     } 
    } 
} 

cuanto a su pregunta sobre cómo obtener una URL de una clase, depende de qué tipo de clase que va a ponerlo en práctica. Por ejemplo, si usted desea conseguir el controlador de corriente y la acción de una extensión HtmlHelper, puede utilizar:

string currentControllerName = (string)helper.ViewContext 
    .RouteData.Values["controller"]; 
string currentActionName = (string)helper.ViewContext 
    .RouteData.Values["action"]; 

Si desea obtener de un controlador, puede utilizar propiedades/métodos de la clase base (Controlador) para construir la URL. Por ejemplo:

var url = new UrlHelper(this.ControllerContext.RequestContext); 
url.Action(an_action_name, route_values); 
+1

Excelente responder. Intenté sin envolverlo en una clase estática y no registraría helper.ActionLink (...). Gracias. –

+0

Ah, y no estaba importando System.Web.Mvc; Mi error. –

Cuestiones relacionadas