ASP.NET MVC - 构建URL或链接的HTML扩展方法

时间:2010-01-08 17:16:08

标签: asp.net-mvc asp.net-mvc-routing

考虑一种扩展方法,其目的是:

  • 呈现<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
    }

更多信息:

  • 使用ASP.NET MVC 1.0

alt text

3 个答案:

答案 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") %>