2010-01-08 57 views
4

考慮擴展方法,其目的是既:ASP.NET MVC - HTML擴展方法建立的網址或鏈接

  • 渲染<a>標籤
  • 在某些情況下,只返回一個字符串,沒有鏈接

  問:在一個擴展方法,你怎麼能與路由值等利用適當的路由邏輯,而不是硬編碼日e字符串。我懷疑HtmlHelper.GenerateRouteLink是解決方案的一部分,但請提出實現此目標的最佳方法。

public static string CreateUserLink(this HtmlHelper html, string userAcctName) 
{ 
    if (string.IsNullOrEmpty(userAcctName)) 
     return "--Blank--"; 

    //some lookup to A.D.    
    DomainUser user = ADLookup.GetUserByAcctName(userAcctName); 

    if (user == null) 
     return userAcctName; 

    //would like to do this correctly! 
    return string.Format("<a href='/MyAppName/User/View/{0}' title='{2}'>{1}</a>" 
         , user.Mnemonic, user.DisplayName, user.Location); 

    //normally returns http://mysite.net/MyAppName/User/View/FOO 
    } 

更多信息:

  • 使用ASP.NET MVC 1.0

alt text

回答

7

我只是不得不在昨天做類似的事情。這樣做可能有一種很好的方式,但它可以幫助我確切地看到發生了什麼,所以我不會假設任何事情。

public static string CreateUserLink(this HtmlHelper html, string userAcctName) 
{ 
    if (string.IsNullOrEmpty(userAcctName)) 
     return "--Blank--"; 

    //some lookup to A.D.    
    DomainUser user = ADLookup.GetUserByAcctName(userAcctName); 

    if (user == null) 
     return userAcctName; 

    RouteValueDictionary routeValues = new RouteValueDictionary(); 

    routeValues.Add("controller", "User"); 
    routeValues.Add("action", "View"); 
    routeValues.Add("id", user.Mnemonic); 

    UrlHelper urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
    TagBuilder linkTag = new TagBuilder("a"); 

    linkTag.MergeAttribute("href", urlHelper.RouteUrl(routeValues)); 
    linkTag.MergeAttribute("title", user.Location); 
    linkTag.InnerHtml = user.DisplayName; 

    return linkTag.ToString(TagRenderMode.Normal); 
} 
+0

+1謝謝尼爾。我編輯了您的答案,以適應我爲使其發揮作用所做的更改。 'MergeAttribute'更合適,而ViewContext.RequestContext是可用的對象而不是ResponseContext。感謝您的示例代碼! – 2010-01-08 18:10:25

+0

不錯的解決方案。 +1 – 2010-01-08 18:21:39

2

將這項工作?

public static string CreateUserLink(this HtmlHelper html, string userAcctName) 
{ 
    if (string.IsNullOrEmpty(userAcctName)) 
     return "--Blank--"; 

    //some lookup to A.D.    
    DomainUser user = ADLookup.GetUserByAcctName(userAcctName); 

    if (user == null) 
     return userAcctName; 

    return html.ActionLink(user.DisplayName, "user", "View", new {title=user.Location}); 
    //normally returns http://mysite.net/MyAppName/User/View/FOO 
} 
+0

謝謝Pharabus;不幸的是'html'沒有/顯示可用的方法。 – 2010-01-08 17:35:30

+2

真的嗎?它是htmlHelper類的System.Web.Mvc.Html命名空間下的一個輔助方法。你使用的是什麼版本的Asp.NEt MVC框架? – Pharabus 2010-01-08 17:40:43

1

我對GenerateRouteLink的經驗一直是一場艱苦的戰鬥。自從我搞砸它之後已經有一段時間了,但是如果它是我想到的微軟的方法,那麼它就是「內部」的,所以你不能在MVC程序集之外訪問和使用它。有很多解決方法,我玩過並且不太喜歡。

我最終做了什麼以避免在我的幫助器方法中對url進行硬編碼是讓它接受'string url'參數並在我的視圖中使用Url.Action,當我調用輔助方法時。這不是最乾淨的,但它是一種解決方法,對我來說效果很好。

<%= Html.CreateUserLink("userAcctName", Url.Action("Home", "Controller") %>