7

「利用規約」ページのいくつかの翻訳のそれぞれの上部にこれがあります。

<li><a href="@Url.Action("Index", "Terms")">English</a></li>
<li><a href="@Url.Action("Index", "Terms", "de")">Deutsch</a></li>
<li><a href="@Url.Action("Index", "Terms", "fr")">Français</a></li>
<li><a href="@Url.Action("Index", "Terms", "it")">Italiano</a></li>
<li><a href="@Url.Action("Index", "Terms", "nl")">Nederlands</a></li>
<li><a href="@Url.Action("Index", "Terms", "hu")">Maygar</a></li>
<li><a href="@Url.Action("Index", "Terms", "es")">Español</a></li>
<li><a href="@Url.Action("Index", "Terms", "zh")">简体中文&lt;/a></li>
<li><a href="@Url.Action("Index", "Terms", "pt-pt")">European Português</a></li>
<li><a href="@Url.Action("Index", "Terms", "pt")">Português</a></li>

これは、クリックを処理する必要があるアクションです。

public class TermsController : Controller
{
    public ActionResult Index(string id)
    {
        switch (id)
        {
            case "de":
                return View("de");
            case "fr":
                return View("fr");
            case "it":
                return View("it");
            case "nl":
                return View("nl");
            case "hu":
                return View("hu");
            case "es":
                return View("es");
            case "zh":
                return View("zh");
            case "pt":
                return View("pt");
            case "pt-pt":
                return View("pt-pt");
            default:
                return View();
        }
    }

これらは私のルートです:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Terms",
        "{controller}/{id}",
        new { controller = "Terms", action = "Index" }
        );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" }
        );

    routes.MapRoute(
        "ThankYou",
        "{controller}/{action}/{email}/{id}"
        );
}

メイン (つまり、英語) の利用規約ページから、最初の (つまり、英語) リンクは正しいように見えます。

http://localhost:65391/Terms/

他の (つまり、外部の) 生成された URL がこのように見えるのはなぜですか?

http://localhost:65391/Terms/?Length=2

また、奇妙なことに、手動で入力すると

http://localhost:65391/Terms/de

たとえば、ドイツ語の規約ページに移動すると、最初のハイパーリンク (つまり、英語の規約ページに戻る) は次のようになります。

http://localhost:65391/Terms/de

実際のサイトを表示するには、ここにアクセスしてください。

http://inrix.com/traffic/terms

4

1 に答える 1

12

3 番目の引数をrouteValuesオブジェクトとして扱う のオーバーロードを使用しています。Url.Action

MSDN から:

routeValues
型: System.Object
ルートのパラメーターを含むオブジェクト。パラメーターは、オブジェクトのプロパティを調べることにより、リフレクションを通じて取得されます。オブジェクトは通常、オブジェクト初期化構文を使用して作成されます。

したがって、3 番目の引数として文字列を渡し"de", "fr"たので、MVC はそのプロパティを取得してキーと値のペアを作成しました。クラスには 1 つのプロパティがあり、文字列の値は 2 であるLength=2ため、ここで が来ます。stringLength

文字列をラップする匿名オブジェクトを渡すことで、これを簡単に修正できます。

<li><a href="@Url.Action("Index", "Terms" new { id = "" })">English</a></li>
<li><a href="@Url.Action("Index", "Terms", new { id = "de" })">Deutsch</a></li>
<li><a href="@Url.Action("Index", "Terms", new { id = "fr" })">Français</a></li>
...

ノート:

  • 匿名オブジェクトのプロパティ名idは、ルート セグメント名idとコントローラー パラメーター名と一致する必要があります。id
  • デフォルトのケースではexpicilty を渡す必要がありnew { id = "" }ます。そうしないと、MVC は既に指定されたルート値を使用します。これはあなたがhttp://localhost:65391/Terms/deケースで見たものです。http://localhost:65391/Terms/deそのため、MVC はすでにidURL の値を見つけ、de自動的に再利用したため、英語のリンクになりました。
  • 最後に、正しいスペルは Maygar ではなく Magyar です
于 2013-05-13T21:02:03.870 に答える