考虑一种扩展方法,其目的是:
<a>
代码
问题:在扩展方法中,如何利用路由值等适当的路由逻辑,而不是对字符串进行硬编码。我怀疑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
}
更多信息:
答案 0 :(得分: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);
}
答案 1 :(得分: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
}
答案 2 :(得分:1)
我对GenerateRouteLink的体验是一场艰苦的战斗。自从我搞砸了它已经有一段时间但是如果它是方法,我认为微软已经把它变成了“内部”,所以你不能在MVC程序集之外访问和使用它。我玩了许多变通方法并且不太喜欢。
我最后做的是为了避免在我的帮助方法中对url进行硬编码,让它接受'string url'参数,并在调用helper方法时在我的视图中使用Url.Action。它不是最干净的,但它是一种对我有用的解决方法。
<%= Html.CreateUserLink("userAcctName", Url.Action("Home", "Controller") %>