使用 htmlAttributes 的事实导致 URL 麻烦

The fact using htmlAttributes causes URL troubles

我正在开发一个 asp .net 项目。我需要将其全球化,所以我遵循了 developpez.com (This one) 上的教程(我是初级开发人员)。我在教程中遇到问题,但经过一些搜索后我解决了它。目前,我有 2 links :

我想做的是用旗帜代替文字。所以,我想在''元素中添加一个class,并放一张背景图片。但是当我添加 class 时,Html.Helper 生成的 link 变得奇怪了。添加了一些参数,我不明白为什么。

编辑:我忘了写 links 在我添加 class.

时不会更改语言 在我将 class 添加到 link

之前

URLs

<a href="/en">English</a>
<a href="/">[Français]</a>

URLs 在我将 class 添加到 link

之后
<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>

我如何将 link 包含到我的部分视图中

@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' 因为在我看来问题就在这里,但我的知识太薄弱无法理解它或理解 html 属性对 URL 的影响.

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

预先感谢您的回答。

我认为你打错了重载,试试:

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

有点难以解释,但让我试试看。没有这样的方法 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;
}

瞧!