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

您正在使用将第三个参数视为routeValues对象的重载。Url.Action

来自 MSDN:

routeValues
类型:System.Object
一个包含路由参数的对象。通过检查对象的属性通过反射检索参数。对象通常是使用对象初始值设定项语法创建的。

因此,您已将字符串"de", "fr"作为第三个参数传递,因此 MVC 获取了它的属性并制作了键值对:这Length=2就是即将到来的地方,因为string该类有一个属性Length,而您的字符串的值为 2。

您可以通过传递包装字符串的匿名对象轻松解决此问题:

<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
  • 您需要new { id = "" }在默认情况下明确传递,否则 MVC 将使用已经给定的路由值。这是你在http://localhost:65391/Terms/de案例中看到的。所以英文链接变成了http://localhost:65391/Terms/de因为 MVC 已经id在 URL 中找到了该值de并自动重用它。
  • 最后注意正确的拼写是 Magyar 而不是 Maygar
于 2013-05-13T21:02:03.870 回答