使用htmlAttributes的事实会导致URL问题

时间:2017-09-20 14:05:59

标签: asp.net asp.net-mvc asp.net-mvc-4 razor

我正在开发一个asp .net项目。我需要全球化它,所以我在developpez.com(This one)上关注了一个教程(我是一个初级开发者)。我的教程有问题,但经过一些搜索我解决了。目前,我有2个链接:

links

我想做的是拥有标志而不是文字。所以,我想在'<中添加一个类。 a>'元素并放置背景图像。但是当我添加类时,Html.Helper生成的链接变得很奇怪。添加了一些参数,我不明白为什么。

编辑:当我添加课程时,我忘了写链接不会改变语言。

在将类添加到链接

之前的

URL

<a href="/en">English</a>
<a href="/">[Français]</a>
将类添加到链接

后的

网址

<a href="/?Count=6&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">English</a>
<a class="drapeauFrance" href="/?Count=6&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">[Français]</a>

我如何包含指向部分视图的链接

@using MIFA.Helpers
@Html.LanguageSelectorLink("en", "[English]", "English", null)
@Html.LanguageSelectorLink("fr", "[Français]", "Français", new { @class = "drapeauFrance" })

LangageSelectorLink的工作原理

public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper, string cultureName, string selectedText, string unselectedText, object htmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
    var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);
    var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText, "LocalizedDefault", language.RouteValues, htmlAttributes);
    return link;
}

LangageUrl如何运作

public static Language LanguageUrl(this HtmlHelper helper, string cultureName, string languageRouteName = "lang", bool strictSelected = false)
{
    cultureName = cultureName.ToLower();
    var routeValues = new RouteValueDictionary(helper.ViewContext.RouteData.Values);
    var queryString = helper.ViewContext.HttpContext.Request.QueryString;
    foreach (string key in queryString)
    {
        if (queryString[key] != null && !string.IsNullOrWhiteSpace(key))
        {
            if (routeValues.ContainsKey(key))
            {
                routeValues[key] = queryString[key];
            }
            else
            {
                routeValues.Add(key, queryString[key]);
            }
        }
    }
    var actionName = routeValues["action"].ToString();
    var controllerName = routeValues["controller"].ToString();
    routeValues[languageRouteName] = cultureName;
    var urlHelper = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection);
    var url = urlHelper.RouteUrl("LocalizedDefault", routeValues);
    var current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower();
    var isSelected = strictSelected ? current_lang_name == cultureName : current_lang_name.StartsWith(cultureName);
    return new Language()
    {
        Url = url,
        ActionName = actionName,
        ControllerName = controllerName,
        RouteValues = routeValues,
        IsSelected = isSelected
    };
}

我正在请求您的帮助,以便了解在添加html属性时URL的更改原因。

我试图理解函数'LanguageUrl',因为在我看来问题就在这里,但我的知识太弱而无法理解或理解htmlAttributes对URL的影响。

如果我犯了一些英语错误,请告诉我我会编辑我的问题。

提前感谢您的回答。

2 个答案:

答案 0 :(得分:1)

我认为你遇到了错误的超载,试试:

var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText,  language.RouteValues, htmlAttributes);

答案 1 :(得分:1)

这有点难以解释,但让我试试。方法RouteLink没有接受类型RouteValueDictionary作为类型object的第三个和html属性的覆盖。相反,会自动假设another override of the Method,其中第三个参数的类型为object

RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, Object routeValues, Object htmlAttributes)

现在效果是RouteValueDictionary被用作匿名对象,通过反映它的属性。这是你不想要的。

一种可能的解决方案是将htmlAttributes转换为参数,以便使用a different Method override

RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, RouteValueDictionary routeValues, IDictionary<string, Object> htmlAttributes)

要实现这一点,您只需将匿名对象转换为IDictionary<string, Object>即可通过调用来完成:

HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

您的新LanguageSelectorLink方法:

public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper, string cultureName, string selectedText, string unselectedText, object htmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
    var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);
    var attributeDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText, "LocalizedDefault", language.RouteValues, attributeDictionary);
    return link;
}

瞧!