尝试开始使用ASP.NET MVC。
我在设置基本路线时遇到了一些困难。
我的路线如下:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
}
我的观点是:
<li>@Html.ActionLink("linkLabel", "Index", "ImproItemForm", new { type = "blablabla" }, null)</li>
我的控制器操作信号是:
public class ImproItemFormController : Controller
{
...
public ActionResult Index(String t)
{
...}
}
该视图生成以下HTML:
<li><a href="/ImproItemForm?type=blablabla">linkLabel</a></li>
这对我来说很好看。 但是,此链接正确调用控制器的操作(使用ImproItem路由),但它不传递blablabla参数。调试应用程序时参数t = null。
你能解释一下为什么吗? 我应该更改什么来正确接收blablabla参数?现在,如果我启动应用程序并尝试浏览
当我浏览时也是正常的: http://localhost:55193/ImproItemForm/Index?id=foobar 它确实调用ImproItemFormController.Index(String t)方法? 我没想到这个URL会与这条路线匹配:
routes.MapRoute(
name: "ImproItem",
url: "{controller}/{action}/{type}",
defaults: new { controller = "ImproItemForm", action = "Index", type = UrlParameter.Optional }
);
我认为参数需要与路由中的名称相同:type而不是id。
提前帮助你。
答案 0 :(得分:2)
我认为参数需要与路径中的名称相同: 输入而不是id。
实际上,当您请求URL - http://localhost:55193/ImproItemForm/Index?id=foobar时,它实际上只调用默认路由,而不是您创建的自定义路由。默认路由有 - 控制器名称,操作名称和ID。这意味着,如果有任何匹配此模式的URL(即{controllername} / {actionname} / {id})将匹配默认路由。
路由顺序在路由收集中非常重要,因为路由表是从上到下构建的,因此只要URL找到其第一个匹配路由,它就会停止进一步扫描。理想情况下,默认路由应该是最底层的路线收集路线。
我想这个特定场景的所有问题都应该通过执行以下两个步骤来解决 -
答案 1 :(得分:1)
更改操作中参数的名称以匹配ActionLink
public ActionResult Index(String type)