Frage

ich meine eigenen Htmlhelper extenstion schreibe für ASP.NET MVC:

public static string CreateDialogLink (this HtmlHelper htmlHelper, string linkText, 
                                      string contentPath)
        {
            // fix up content path if the user supplied a path beginning with '~'
            contentPath = Url.Content(contentPath);  // doesn't work (see below for why)

            // create the link and return it
            // .....
        };

Wo Ich habe Probleme ist tryin UrlHelper zuzugreifen innerhalb Definition meine Htmlhelper ist. Das Problem ist, dass die Art und Weise Sie in der Regel HtmlHelper Zugriff (via Html.MethodName(...)) über eine Eigenschaft auf der Ansicht ist. Das ist mir nicht verfügbar offensichtlich aus mit meiner eigenen Nebenklasse.

Dies ist der eigentliche Code MVC Quelle für ViewMasterPage (Stand: Beta) -. Die Html und Url definiert

public class ViewMasterPage : MasterPage
    {
        public ViewMasterPage();

        public AjaxHelper Ajax { get; }
        public HtmlHelper Html { get; }
        public object Model { get; }
        public TempDataDictionary TempData { get; }
        public UrlHelper Url { get; }
        public ViewContext ViewContext { get; }
        public ViewDataDictionary ViewData { get; }
        public HtmlTextWriter Writer { get; }
    }

Ich möchte diese Eigenschaften innerhalb eines Htmlhelper zugreifen können.

Das Beste, was ich habe kommen mit ist dies (Einsatz am Anfang des CreateDialogLink Methode)

HtmlHelper Html = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer);
UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

Bin ich eine andere Möglichkeit fehlt, die bestehenden HtmlHelper und UrlHelper Instanzen zugreifen - oder muss ich eine neue erstellen müssen wirklich? Ich bin sicher, dass es nicht viel Aufwand, aber ich würde es vorziehen, die bereits existierenden diejenigen zu verwenden, wenn ich kann.

War es hilfreich?

Lösung

Bevor diese Frage ich auf einige der MVC-Quellcode ausgesehen hatte, aber offenbar das ich verpasst, das ist, wie sie es für die Bild-Helfer tun.

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
        public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
            if (String.IsNullOrEmpty(imageRelativeUrl)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
            }

            UrlHelper url = new UrlHelper(helper.ViewContext);
            string imageUrl = url.Content(imageRelativeUrl);
            return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
        }

Sieht aus wie ein neues UrlHelper Instanziierung Der richtige Ansatz ist, nachdem alle. Das ist gut genug für mich.


Update: RTM-Code von ASP.NET MVC v1.0 Source Code ist etwas anders als in den Kommentaren darauf hingewiesen.

Datei: MVC \ src \ MvcFutures \ Mvc \ ImageExtensions.cs

 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
        public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
            if (String.IsNullOrEmpty(imageRelativeUrl)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
            }

            UrlHelper url = new UrlHelper(helper.ViewContext.RequestContext);
            string imageUrl = url.Content(imageRelativeUrl);
            return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
        }

Andere Tipps

stand ich ein ähnliches Problem und entschied, dass es einfacher wäre, nur die UrlHelper in der Ansicht aufrufen und die Ausgabe auf meine Htmlhelper Erweiterung passieren. In Ihrem Fall wäre es wie folgt aussehen:

<%= Html.CreateDialogLink( "text", Url.Content( "~/...path.to.content" ) ) %>

Wenn Sie die Erweiterungsmethoden auf dem vorhandenen Htmlhelper zugreifen möchten, die in Ihrer Klasse übergeben wird, sollten Sie brauchen nur System.Web.Mvc.Html im Quellcode-Datei zu importieren, und Sie werden zu ihnen Zugang (das ist, wo die Erweiterungsklassen definiert sind). Wenn Sie eine UrlHelper wollen, müssen Sie instanziiert, dass als Htmlhelper Sie bekommen keinen Griff für die View dass es herkommt.

Wenn Sie eine UrlHelper in einer Utility-Klasse erstellen Sie folgendes tun:

string url = "~ / content / images / foo.jpg";

  var urlHelper = new UrlHelper(new RequestContext(
                  new HttpContextWrapper(HttpContext.Current), 
                  new RouteData()), RouteTable.Routes);

  string absoluteUrl = urlHelper.Content(url);

Auf diese Weise können Sie Routing oder '~ Expansion' verwenden, weg von einem MVC-Kontext.

Nun, man kann immer die Instanz der Seite der Erweiterung Methode übergeben. Ich denke, das ist ein viel besserer Weg, dies zu tun, als neue Instanzen in Ihrer Methode zu schaffen.

Sie können auch diese Methode für eine Klasse definieren, die von Masterpage / Viewmaster leitet und leiten dann die Seite aus, dass. Auf diese Weise haben Sie Zugriff auf alle Eigenschaften der Instanz und müssen sie nicht überschreiten sie herum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top