在此页面上:
http://nerddinnerbook.s3.amazonaws.com/Part4.htm
添加控制器后,我可以浏览http://localhost:xxxx/dinners
并按预期工作。我的问题是如何使用“晚餐”? “晚餐”在哪里?我的控制器名为DinnersController,所以Dinners这个词是如何变得有意义的。我在Linq to SQL或其他任何地方都没有看到它。我敢肯定我忽略了一些显而易见的事情。
以下是代码:
// // HTTP-GET: /Dinners/ public void Index() { Response.Write("<h1>Coming Soon:
晚餐“); }
// // HTTP-GET: /Dinners/Details/2 public void Details(int id) { Response.Write("<h1>Details DinnerID:
“+ id +”“); }
“晚餐”来自哪里?
感谢您的帮助。
编辑:在我发布之前,我在文章中进一步阅读并了解了global.asax,但我不明白它是如何映射到晚餐的:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
答案 0 :(得分:4)
ASP.NET MVC支持约定优于配置。这意味着它将查找具有Controller后缀的控制器,并且不将其作为URL的一部分包含在内,并且仅包含Controller的前缀。因此,如果您有HomeController,您可以访问/ Home /就像DinnersController意味着/ Dinners /。这是ASP.NET MVC框架本身的一部分。
如果您查看Global.asax中的默认路由,您会看到它使用的格式类似于......
"{controller}/{action}/{id}"
这意味着获取控制器的名称和操作的名称,并将请求指向该方法。
所以对于DinnersController Index动作方法,它看起来像/ Dinners / Index。
答案 1 :(得分:2)
我没有在我面前的示例,但我怀疑路由(请参阅Global.asax
)设置为使用Dinners
作为默认控制器名称;负责的具体行看起来像
new { controller = "Dinners", action = "Index", id = "" }
编辑:重新阅读问题,这并不能完全回答;您感到困惑的问题是/dinners
已解决为DinnersController
;没有任何默认行为。对于这种情况,Chad的答案是正确的,正如你所说的那样 - 框架基本上会切断Controller
部分并找出要映射的名称。
答案 2 :(得分:1)
这是MVC通过其默认路由为您提供的“隐式配置”(约定与配置)的一部分。
当您访问“www.mysite.com/dinners”时,MVC将自动查看URL中的“晚餐”,并查找名为“DinnersController”的控制器并调用“索引”方法。如果您访问“www.mysite.com/dinners/details”,MVC会查找“DinnersController”并调用“详细信息”方法。
如果你看看rails上的ruby,它的行为方式大致相同(几乎可以肯定是微软从中得到的)。