12

Önceden ayarlanmış değerlerle bir ActionLink oluşturmak için bir HtmlHelper yazmak istiyorum, örn. PageLinkİçerisinden Html.ActionLink ve Url.Action'ı (...) kullanarak Denetleyici

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

mesela bilinen bir Eylem ve Denetleyici ile ActionLink çağıran bir işlevdir. "Dizin" ve "Sayfa".

HtmlHelper ve UrlHelper'dan beri ve Controller veya sınıfından beri, sınıfın içinden gelen bir eyleme ilişkin göreli URL'yi nasıl alabilirim?

Güncelleme: sadece

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

Uzantınız yöntemi sevimli ve kısa olabilir Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) veya daha iyisi, kullanmak, ancak ekler: Şimdi sahip tahakkuk tecrübe ek üç yıl göz önüne alındığında, burada benim tavsiyem Başka bir test edilmemiş başarısızlık noktası ve herhangi bir gerçek değer eklemeden işe yeni bir öğrenme gereksinimi. Bunu karmaşık bir sistem tasarımı olarak düşünün. Güvenilirlik (hayır), okunabilirlik (daha fazla dokümanı okuduktan sonra), hız (hiçbiri) veya eşzamanlılık (hiç) eklemezse, neden başka bir hareketli parça eklemelisiniz.

+0

+1. Ayrıca gelecekteki arama yapanları bu soruyu kontrolörün içinden 'Url.Action' çağırmakla işaret edebilirim - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins

cevap

20

Sorunuzu açık bir şekilde anladığımdan emin değilim, ama deneyeyim.

gibi bir şey size anlatıldığı gibi, bir HtmlHelper uzantısı oluşturmak denemek için: Bir sınıftan bir URL alma konusunda Sorunuza gelince

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

, bunu uygulamak edeceğiz sınıfın ne tür bağlıdır. Eğer bir HtmlHelper uzantısından akım kontrolörü ve harekete almak istiyorsanız Örneğin, şunları kullanabilirsiniz:

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

bir denetleyicisinden bunu elde etmek istiyorsanız, (baz sınıfından özellikleri/yöntemleri kullanabilirsiniz Denetleyici) URL'yi oluşturmak için. Örneğin, güncelleme için

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

Mükemmel Cevap. Bunu statik bir sınıfta sarmalamadan denedim ve helper.ActionLink (...) dosyasını kaydettirmedim. Teşekkürler. –

+0

Ah ve System.Web.Mvc'yi almadım; Benim hatam. –