gpt4 book ai didi

asp.net-mvc-routing - @Url.Action 获得 ?Length=2 附加

转载 作者:行者123 更新时间:2023-12-04 13:40:50 26 4
gpt4 key购买 nike

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

<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

最佳答案

您正在使用 an overloadUrl.Action它将第三个参数视为 路由值 目的。

来自 MSDN:

routeValues
Type: System.Object
An object that contains the parameters for a route. The parameters are retrieved through reflection by examining the properties of the object. The object is typically created by using object initializer syntax.



所以你已经传递了字符串 "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和 Controller 参数名称 id
  • 您需要通行证new { id = "" }在默认情况下,否则 MVC 将使用已经给定的路由值。这是您在 http://localhost:65391/Terms/de 中看到的案件。于是英文链接变成了http://localhost:65391/Terms/de因为MVC已经找到了id URL 中的值是 de并自动重用它。
  • 最后注意正确的拼写是 Magyar 而不是 Maygar
  • 关于asp.net-mvc-routing - @Url.Action 获得 ?Length=2 附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688789/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com