Frage

Ich mag eine Htmlhelper schreiben eine Action mit voreingestellten Werten zu machen, zum Beispiel.

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

Dabei gilt PageLink eine Funktion, die ActionLink mit einer bekannten Action-und-Controller aufruft, zB. "Index" und "Seite".

Da HtmlHelper und UrlHelper nicht in einem Controller oder Klasse existieren, wie bekomme ich die relative URL auf eine Aktion aus dem Innern einer Klasse?

Update: In Anbetracht der zusätzlichen drei Jahre aufgelaufene Erfahrung, die ich jetzt habe, hier ist mein Rat: nur Gebrauch Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) oder besser noch,

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

Ihre Erweiterungsmethode kann nett und kurz sein, aber es ist ein weiteren ungetestet Point-of-Failure und einen neuen Lernbedarf für Mitarbeiter ohne Zugabe von realem Wert auch immer. Betrachten Sie es als ein komplexes System zu entwerfen. Warum eine andere bewegliche Teil hinzufügen, es sei denn, es Zuverlässigkeit fügt hinzu (nein), Lesbarkeit (wenig, wenn Sie lesen mehr docs), Geschwindigkeit (keine) oder Concurrency (keine).

War es hilfreich?

Lösung

Nicht sicher, ob ich verstanden tatsächlich Ihre Frage klar, aber lassen Sie mich versuchen.

eine Htmlhelper Erweiterung erstellen, wie Sie beschrieben, versuchen Sie so etwas wie:

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

Was Ihre Frage auf eine URL aus einer Klasse bekommt, hängt davon ab, welche Art von Klasse Sie es implementieren werden. Zum Beispiel, wenn Sie den aktuellen Controller und die Aktion von einer Htmlhelper Erweiterung erhalten möchten, können Sie:

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

Wenn Sie es von einer Steuerung erhalten möchten, können Sie Eigenschaften / Methoden von der Basisklasse (Controller), um die URL zu erstellen. Zum Beispiel:

var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top