1

すべてのページに表示される言語チューザーを実装しようとしています。

私のアプリケーションには現在2つのルートがあります。

routes.MapRoute(
    name: "EventDriven",
    url: "{language}/{eventid}/{controller}/{action}/{id}",
    defaults: new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{language}/{controller}/{action}/{id}",
    defaults: new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);

また、共有_layout.cshtmlファイルには、次のアクションリンクがあります。

@Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString(), new {language="en"})
@Html.ActionLink("Français", ViewContext.RouteData.Values["action"].ToString(), new {language="fr"})

私が直面している問題は、{eventid}ルートセグメントを保持したいのですが、すべてのURLに適用できるわけではありません。

ホームページhttp://localhost/MySite/の2つのアクションリンクは次のとおりです。

English: http://localhost/MySite/
French: http://localhost/MySite/fr

これは良いことですが、私の内部ページhttp://localhost/MySite/en/2/Donationのアクションリンクは次のとおりです。

English: http://localhost/MySite/en/2/Donation
French: http://localhost/MySite/fr/Donation

に行くとhttp://localhost/MySite/fr/2/Donation、アクションリンクは次のとおりです。

English: http://localhost/MySite/en/Donation
French: http://localhost/MySite/fr/2/Donation

2問題は、言語変更アクションリンクにeventid情報が含まれていないことです。

明示的にプログラムしなくても、両方のリンクにイベントと言語の情報(および将来予測できないその他のルートパラメーター)が含まれるようにするにはどうすればよいですか?

4

2 に答える 2

2

最終的に使用する可能性があるのはHtml.RouteLink()です

この場合、私はそれを次のように呼びます(複数の言語が必要な場合は配列に変更されます):

@{
   var enRoute = new RouteValueDictionary(ViewContext.RouteData.Values);
   enRoute["language"] = "en";
   ....
}

(新しいRouteValueDictionary()を覚えておいてください、既存のものを上書きしたくないです)

その後:

@Html.RouteLink("English", enRoute)

それは少し厄介で、view変数(私は嫌いです)を使用せずにそれを回避することはできませんが、リンクのルート全体を取得します。

于 2013-04-09T12:47:45.430 に答える
0

このメソッドを使用するインラインの方法:

@Html.ActionLink("English", this.ViewContext.RouteData.Values["controller"].ToString(), new RouteValueDictionary(ViewContext.RouteData.Values) {["language"] = "en"})
于 2016-03-09T20:14:55.693 に答える