bir*_*dus 6 asp.net-mvc-routing
我在"使用条款"页面的几个翻译的顶部有这个:
<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>
Run Code Online (Sandbox Code Playgroud)
这是应该处理点击的操作:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的路线:
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}"
);
}
Run Code Online (Sandbox Code Playgroud)
在主要(即英语)条款页面中,第一个(即英语)链接看起来是正确的:
http://localhost:65391/Terms/
Run Code Online (Sandbox Code Playgroud)
为什么其他(即外国)生成的URL看起来像这样?
http://localhost:65391/Terms/?Length=2
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我手动输入
http://localhost:65391/Terms/de
Run Code Online (Sandbox Code Playgroud)
例如,并转到德语的条款页面,然后第一个超链接(即,返回英语术语页面)如下所示:
http://localhost:65391/Terms/de
Run Code Online (Sandbox Code Playgroud)
到这里查看实际网站:
nem*_*esv 11
您使用的过载的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>
...
Run Code Online (Sandbox Code Playgroud)
笔记:
id应与您的路段名称id和控制器参数名称匹配idnew { id = "" }在默认情况下进行expicilty传递,否则MVC将使用已经给定的路由值.这就是你在http://localhost:65391/Terms/de案件中看到的.所以英文链接成为http://localhost:65391/Terms/de因为MVC已经id在URL中找到了值de并自动重用它.| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |