2017-09-20 31 views
0

私はasp .netプロジェクトで作業しています。グローバル化してdeveloppez.com(This one)のチュートリアル(私はジュニア開発者です)に従ってください。私はチュートリアルに問題がありますが、いくつかの検索の後に私はそれを解決します。私は何をしたいのはテキストの代わりにフラグを持つことであるhtmlAttributesを使用するとURLの問題が発生する

links

:現在、私は2つのリンクを得ました。ですから、 '< a>'要素にクラスを追加して背景画像を入れたいと思います。しかし、クラスを追加すると、Html.Helperによって生成されたリンクが奇妙になりつつあります。いくつかのパラメータが追加され、私はなぜそれが理解できません。

EDIT:クラスを追加するとリンクが言語を変更しないと書いているのを忘れてしまいました。

の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> 

にクラスを追加した後、私はリンクに

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

URLをクラスを追加する前に、

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

方法LangageSelectorLinkは動作します

LangageUrl私はHTML属性を追加するときに、URLが変更された理由を私は理解してあなたの助けを求めている

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

仕組み

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

「LanguageUrl」関数を理解しようとしましたが、問題はここにありますが、私の知識が理解できないか、htmlAttributesのURLへの影響を理解するには弱すぎます。

英語の間違いをした場合は、私の質問を編集するように教えてください。

ご回答いただきありがとうございます。私はあなたが間違って過負荷を打つと思います

答えて

1

それは説明したが、私が試してみましょうするために少し難しいです。このようなメソッドRouteLinkの無効化は、タイプobjectの第3およびhtml属性としてタイプRouteValueDictionaryを受け入れることはありません。

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

今効果がRouteValueDictionaryそれはプロパティをだ反射することにより、匿名オブジェクトのように使用されることである。第三のパラメータはタイプobjectである代わりに、another override of the Methodは、自動的に仮定されます。あなたがしたくないものはどれですか?

一つの可能​​な解決策は、a different Method overrideが使用されているように、パラメータにhtmlAttributesを変換するために、次のようになります。

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; 
} 
呼び出すことで、

voilà!

+1

ああ、私はこの違いに気付かなかった、あなたは正しい、これは問題だった。あなたの説明と文書の参考書をありがとう。私は学ぶことがたくさんあり、あなたは私がこれをするのを手助けします。本当にありがとう! –

1

、試してみてください。

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

私は試しましたが、何も変わりませんでした。私を助けてくれてありがとう。 –

+0

私は最後のコメントを編集できませんが、あなたが正しいです、ちょうど私はあなたの答えを使用する方法を理解していませんでした。ありがとうmxmissile! –

関連する問題