【问题标题】:Views / Controller Actions / Routes / Gobal.asax视图/控制器操作/路由/Global.asax
【发布时间】:2012-08-08 23:41:51
【问题描述】:
我是 ASP.NET MVC 的新手,过去一年来自 Web 表单背景,我最近开始使用 MVC 3,并且有一些问题似乎没有很好的答案(我找不到这个)点)并想在这里发布它们。任何帮助,将不胜感激。我的问题只关注控制器、控制器操作、视图和 global.asax。
我了解与控制器中的视图、控制器和操作的关系。但是,在创建视图时,是否必须在 global.asax 中注册与创建的视图关联的每个操作?示例:当创建一个空项目时,global.asax 已经为 Home 控制器创建了一个默认路由,其中 Index 和 id 的操作是可选的。那么,如果我基于 Home 控制器创建另一个名为“AboutUs”的视图,我是否需要在 global.asax 中将其注册为 Home 控制器的一部分?
在路由的 global.asax 中的控制器/操作和注册方面是否存在一对一的关系?是否可以将多个控制器操作添加到以逗号分隔的同一语句中(例如在 global.asax 中使用示例 Home 控制器,然后将另一个操作添加到同一语句中,或者是否需要在外部添加新语句那个?
在创建控制器/视图/路由时是否有“最佳实践”标准可供使用?
我之所以问这些问题,是因为我正在将一个 Web 表单站点转换为 MVC 3,但我的问题并没有找到很多好的答案。期待任何和所有的回应。
【问题讨论】:
标签:
asp.net-mvc
asp.net-routing
【解决方案1】:
Scott Gu 在他的博客上有一个great post,关于 MVC 路由的工作原理,你应该去看看!
每个路由在 Global.asax 中都有一个匹配模式,但不一定是显式匹配。对于您的示例,如果您有一个名为“AboutUs”的视图,如果您有一个名为的控制器操作,它将由于模式匹配而工作:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
行:"{controller}/{action}/{id}" 是路由引擎正在匹配的模式。它表示任何与上面匹配的 URL 路径都将被发送到正确的视图。对于您的示例,如果您要遵循 url:Home/AboutUs,那么它将带您到 Home Controller,关于我们视图,没有参数。
关于您的第二个问题,选择的控制器也是模式的一部分。如果您添加了第二个控制器,称为联系人,然后添加了一个称为电子邮件的操作,则此 url 仍将遵循相同的模式:Contact/Email,因此您无需添加额外的路由。
这里有一些其他关于 MVC 路由如何工作的精彩博客文章,它们将为您指明正确的方向。 Asp.Net、a blog post 和 MSDN 上的一个
【解决方案2】:
不,您不需要注册在 Global.asax 中创建的每个视图。只要您遵循约定,路由就会解决这个问题(即为您定义的路由或您自己定义的路由,如果您走这条路)
不再。当您在控制器中创建新动作时,您通常需要为该动作创建一个视图以呈现它打算执行的操作(ajax/json 动作可以作为此规则的例外)。但同样,您不需要在 Global.asax 中注册任何内容。只要您遵循该全局文件中定义的路由约定。
我会说它带有 MVC 经验。一般来说,每个问题都有自己的解决方案,所以它取决于手头的任务,而不是一般的方法。但是,您可以从 MVC 3 为您定义的默认值开始:I.E.重新定义了路由和多个控制器,每个控制器都有多个操作。同样,遵循约定。
希望这会有所帮助。