私は、ユーザーが言語を選択できるようにするためのコンボボックスの実装に数日間苦労してきました。私はMVC3を使用していて、URLに言語を埋め込むこの記事から始めました。私はそのアプローチが好きですが、各言語のリンクを提供する代わりに、ユーザーがドロップダウンリストから言語を選択できるようにしたいのです。ユーザーが言語を選択したときに、URLを現在の場所と新しい言語にリダイレクトする方法がわかりません。私は素朴にこれを試しました:
_Layout.cshtmlで
<li>
@using (Html.BeginForm("SelectLanguage", "Home", new { url = @Request.RawUrl }))
{
<select name="lang" id="lang" size="1" onchange="changeLanguage(this)">
<option value="en">English </option>
<option value="it">Italian (Italian)</option>
<option value="es">Español (Spanish)</option>
</select>
}
</li>
HomeController.csで
static void AddOtherValues(RouteData routeData, RouteValueDictionary destinationRoute)
{
foreach (var routeInformation in routeData.Values)
{
if (routeInformation.Key == GlobalizedRoute.CultureKey)
continue; //Do not re-add, it will throw, this is the old value anyway.
destinationRoute.Add(routeInformation.Key, routeInformation.Value);
}
}
public ActionResult SelectLanguage(string url, string language, RouteData route)
{
RouteValueDictionary globalizedRouteData = new RouteValueDictionary();
globalizedRouteData.Add(GlobalizedRoute.CultureKey, language);
AddOtherValues(RouteData, globalizedRouteData);
return RedirectToRoute(globalizedRouteData);
}
しかし、私が新しい言語を選択したときのどこにいても、ルートデータではなく、RouteData
がSelectLanguage
含まれHomeController
ているのはばかげています。SelectLanguage
したがってSelectLanguage
、無限に再帰的です。私がやりたいのは、ユーザーが別の言語を選択するたびに現在RouteData
のSelectLanguage
アクションをアクションに渡すことですが、その方法がわかりません。文字列のみであるため、toの受け渡しは機能route = ViewContext.RouteData
しBeginForm
ません。route=System.Web.Routing.RouteData
(役に立たないフォームのレンダリングされたhtml 。)ルートデータをJavaScriptに取り込む方法を示すこの記事を見つけたところ、フォームに(どういうわけか)挿入できると思いますが、それは必要ですか?ルートデータの不必要な往復のように感じます。このアプローチのための単純なもの、またはさらに単純な解決策が欠けていますか?
編集-ハイパーリンクが欠落していることに気づきました。これにより、私が何について話しているのかを誰もが知ることが難しくなります。追加されたので、うまくいけば人々は入力を与え始めるでしょう:)