【问题标题】:The fact using htmlAttributes causes URL troubles使用 htmlAttributes 的事实会导致 URL 问题
【发布时间】:2017-09-20 14:05:59
【问题描述】:

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

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

编辑:我忘了写链接在添加类时不会改变语言。

向链接添加类之前的 URL

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

将类添加到链接后的 URL

<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 的影响。

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

提前感谢您的回答。

【问题讨论】:

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


    【解决方案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&lt;string, Object&gt;,您将通过以下方式调用:

    HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    

    你的新LanguageSelectorLinkMethod:

    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;
    }
    

    瞧!

    【讨论】:

    • 哦,我没有注意到这个区别,你说得对,这就是问题所在。感谢您的解释和文档的参考。我有很多东西要学,你帮助我做到这一点。真的谢谢你!
    【解决方案2】:

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

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

    【讨论】:

    • 我试过了,但没有任何改变。谢谢你帮助我。
    • 我无法编辑我的最后一条评论,但你是对的,只是我不明白如何使用你的答案。谢谢你 mxmissile !
    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多