Pregunta

Quiero escribir un HtmlHelper que rendir ActionLink con los valores preestablecidos, por ejemplo.

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

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

Desde HtmlHelper y UrlHelper no existen dentro de un Controller o clase, ¿cómo puedo obtener la dirección URL relativa a una acción desde el interior de una clase?

Actualización: Teniendo en cuenta los tres años adicionales de experiencia acumulada que tengo ahora, aquí está mi consejo: solo uso 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 fracaso en el punto de no probada y un nuevo requisito de aprendizaje para los empleados sin añadir ningún valor real en absoluto. Piense en ello como el diseño de un sistema complejo. ¿Por qué añadir otra pieza en movimiento, a menos que se suma fiabilidad (no), la legibilidad (poco, una vez que lea más docs), velocidad (ninguno) o de concurrencia (ninguno).

¿Fue útil?

Solución

No está seguro de que realmente entendía su pregunta con claridad, 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);
        }
    }
}

En 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 las 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top