@ Url.Action得怎么样?长度= 2所附(@Url.Action getting ?Leng

2019-08-18 03:14发布

我有这个在每个“使用条款”页面的几个译本的顶部:

<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")">简体中文</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

Answer 1:

您使用的过载的的Url.Action作为routeValues对象它把第三个参数。

从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>
...

笔记:

  • 您annonymous对象属性名id应该与你的路线段名id和控制器参数名id
  • 你需要expicilty通过new { id = "" }在默认的情况下,否则MVC将使用已经给路由值。 这是你已经看到了在http://localhost:65391/Terms/de的情况。 所以英文链接成为http://localhost:65391/Terms/de ,因为MVC已经发现的id值在其中的URL de ,并自动重新使用它。
  • 最后要注意正确的拼写是马扎尔人,而不是Maygar


文章来源: @Url.Action getting ?Length=2 appended