HTML yardımcısında URL oluştur


168

Normalde bir ASP.NET görünümünde bir URL (değil <a>) elde etmek için aşağıdaki işlev kullanılabilir :

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

Ancak, özel bir HTML yardımcısından nasıl yapılacağını bulamıyorum. Sahibim

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

Helper değişkeni, Action ve GenerateLink yöntemlerine sahiptir, ancak <a>'s üretir . ASP.NET MVC kaynak kodunda bazı kazma yaptım, ama basit bir yol bulamadık.

Sorun yukarıdaki Url görünüm sınıfının bir üyesi ve somutlaştırılması için bazı bağlamlar ve yol haritaları (ki ben uğraşmak istemiyorum ve yine de olması gerekiyordu) ihtiyacı olmasıdır. Alternatif olarak, HtmlHelper sınıfının örneği de, Url örneğinin bağlam bilgilerinin alt kümesinin akşam yemeği olduğunu varsaydığım bazı içeriğe sahiptir (ancak yine bununla uğraşmak istemiyorum).

Özetle, bunun mümkün olduğunu düşünüyorum ama görebildiğim tüm yollar, az ya da çok dahili ASP.NET şeyler ile bazı manipülasyonlar içerdiğinden, daha iyi bir yol olup olmadığını merak ediyorum.

Düzenleme: Örneğin, gördüğüm bir olasılık:

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

Ama doğru görünmüyor. UrlHelper örnekleriyle kendim uğraşmak istemiyorum. Daha kolay bir yol olmalı.


3
Bunun basitleştirilmiş bir örnek olduğunun farkındayım, ancak gösterilen örnek için HtmlHelper yerine UrlHelper'ı genişleteceğim. Gerçek kodunuzun her ikisine de ihtiyacı olabilir.
Craig Stuntz

Maalesef daha net olmalıydım: Uzantı yönteminde bazı HTML oluşturma yapmak istedim ve bunun için URL'ler oluşturmam gerekiyordu.
Jan Zich

Yanıtlar:


217

Html yardımcı uzantısı yöntemi içinde böyle bir url yardımcısı oluşturabilirsiniz:

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

2
Ben de yapıcı RouteCollection başlatmaknew UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection)
kpull1

22

Ayrıca UrlHelpergenel ve statik sınıfı kullanarak da bağlantı alabilirsiniz :

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

Bu örnekte, biraz avantaj sağlayabilecek yeni UrlHelper sınıfı oluşturmanız gerekmez.


RouteCollection ayarlar çünkü bu cevabı daha çok seviyorum.
kpull1

10

İşte UrlHelperbir HtmlHelperörnek almak için benim küçük extenstion yöntemi :

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

Şu şekilde kullanın:

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

(Bu ans'ı yalnızca referans olması için gönderiyorum)


Mükemmel yaklaşım çünkü yeni bir nesne oluşturmak yerine mevcut bir nesneyi yeniden kullanır.
Mike

ASP.NET 4.5 kullanıyoruz ve yeniden giriş sorunları yaşıyoruz. UrlHelper'ın http isteklerinde yeniden kullanılabileceğine inanmıyoruz. Lütfen dikkat edin.
Carl 't Veld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.