ASP.NET MVC - метод расширения HTML, создающий URL или ссылку - PullRequest
4 голосов
/ 08 января 2010

Рассмотрим метод расширения, целью которого является либо:

  • отображает тег <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 ]

7 голосов
/ 08 января 2010

Мне просто нужно было сделать что-то похожее на это вчера. Может быть, есть более изящный способ сделать это, но он помогает мне точно видеть, что происходит, поэтому я ничего не понимаю.

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);
}
2 голосов
/ 08 января 2010

будет ли это работать?

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
}
1 голос
/ 08 января 2010

Мой опыт работы с GenerateRouteLink был тяжелым сражением. Прошло много времени с тех пор, как я с ней связался, но если я думаю, что этот метод Microsoft сделал его «внутренним», вы не сможете получить к нему доступ и использовать его вне сборки MVC. Есть ряд обходных путей, с которыми я играл и которые мне не очень понравились.

То, что я в итоге сделал, чтобы избежать жесткого кодирования URL-адреса в моих вспомогательных методах, заключается в том, чтобы он принимал параметр 'string url' и использовал Url.Action на мой взгляд, когда я вызываю вспомогательный метод. Это не самый чистый, но это обходной путь, который хорошо сработал для меня.

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