Asp.net mvc 3 MVC3路由基础
我正在学习MVC路由。希望我的问题看起来不傻,请帮忙:) Msdn reference说它需要一个字符串、字符串和对象,所以我尝试做一个小的更改(在所有内容前面添加一个“我的”,只是为了修改名称,看看是否有效): 它不再工作了。这些字符串在“{}”花括号中的格式是什么?匿名对象值格式是什么 {controller}/{action}/{id} /产品/展览/饮料 {table}/Details.aspx /Products/Details.aspx 博客/{action}/{entry} /blog/show/123 {reporttype}/{year}/{month}/{day} /销售/2008/1/5 {locale}/{action} /美/秀 {语言}-{国家}/{行动} /en US/展览 {controller}/{action}/{id} {resource}.axd/{*pathInfo}Asp.net mvc 3 MVC3路由基础,asp.net-mvc-3,routing,format,Asp.net Mvc 3,Routing,Format,我正在学习MVC路由。希望我的问题看起来不傻,请帮忙:) Msdn reference说它需要一个字符串、字符串和对象,所以我尝试做一个小的更改(在所有内容前面添加一个“我的”,只是为了修改名称,看看是否有效): 它不再工作了。这些字符串在“{}”花括号中的格式是什么?匿名对象值格式是什么 {controller}/{action}/{id} /产品/展览/饮料 {table}/Details.aspx /Products/Details.aspx 博客/{action}/{entry} /bl
我用谷歌搜索了一下,但是所有的帖子似乎都认为我知道格式,找不到任何详细的解释。它们必须是固定的名称,比如{controller}{action}{id}等等,否则它们就不起作用了吗?默认的匿名对象值名称也需要匹配吗?此外,{*pathInfo}中的“*”是什么意思?我找不到解释,内特。谢谢。首先,我们需要一些定义 让我们把默认路线分解一下
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
在本例中,第2行的默认值仅是用于标识路由的文本名称
第3行是url模式。这定义了路由的匹配方式。大括号中的内容是占位符。它们映射到参数名。因此{controller}映射到控制器名称。{action}映射到action name,{id}映射到名为id的参数
第4行是默认对象。当无法从url推断默认值时,此对象提供默认值
因此,如果我们把所有这些放在一起,我们可以得出以下结论:
默认对象仅在无法从url字符串推断时提供值。因此,当传入请求仅为/
时,第4行的dfault值用于控制器和操作。如果传入的请求是/Blah
,那么第4行提供的默认控制器将被忽略,而MVC将查找BlahController
。但是,由于未指定任何操作,因此使用第4行的默认操作索引
这里要记住的关键是,只有当第3行中的url不匹配时,才使用第4行中的值
所以,当你改变一切的时候,你把一切都抛在脑后。这是一个没有意义的路由,因为没有定义要使用哪个控制器或操作,而这两个值是完成路由所必需的。因此,MVC无法确定您想要什么控制器。或是针对这件事的行动方法
另一个例子:
routes.MapRoute(
"Example",
"Home/{action}/{myid}",
new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);
因为url中没有{controller}
占位符,所以使用默认的“NotHome”,这使得MVC查找NotHome控制器
。因此,url/Home/About/3
意味着controller=“NotHome”、action=“About”和myid=3
总而言之,在传入路由中,控制器和操作的值必须至少填写一些内容。id是可选的,可以重命名为任何您喜欢的名称。但是,必须设置控制器和操作参数,否则MVC不知道如何路由
此外,请记住,默认路由(或有效的默认路由)必须位于列表的最后一个,否则其他路由将不匹配
{*pathInfo}
位称为slug。它基本上是一个通配符,表示“这一点之后的所有内容都被填充到名为pathInfo的参数中”。因此,如果您有“{resource}.axd/{*pathInfo}”
和如下url:http://blah/foo.axd/foo/bar/baz/bing
然后创建两个参数,一个名为resource
,其中包含foo
,另一个名为pathInfo
,其中包含foo/bar/baz/bing
,感谢您的帮助。我还发现,ASP.NET MVC需要某些特殊的参数名。例如{controller}来实例化控制器类,{action}来指示要调用的方法。所以,这两个和其他几个(我想,我还不完全知道)。这些是硬编码的参数名称。@Tom-否。正如我在示例中所示,url中不需要{controller}
,但您需要一个控制器和一个动作参数,无论它来自url还是默认对象。谢谢。我只需要“另外,请记住,默认路由(或有效的默认路由)必须排在列表的最后,否则其他路由将不匹配。”:)
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Example",
"Home/{action}/{myid}",
new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);