使用 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&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">English</a>
<a class="drapeauFrance" href="/?Count=6&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&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;
}
瞧!
我正在开发一个 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&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">English</a>
<a class="drapeauFrance" href="/?Count=6&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&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;
}
瞧!