Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3路由基础_Asp.net Mvc 3_Routing_Format - Fatal编程技术网

Asp.net mvc 3 MVC3路由基础

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

我正在学习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}


我用谷歌搜索了一下,但是所有的帖子似乎都认为我知道格式,找不到任何详细的解释。它们必须是固定的名称,比如{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 }
);