【问题标题】:Nerd Dinners Controllers书呆子晚餐控制器
【发布时间】:2010-10-25 22:31:55
【问题描述】:

在这个页面上:

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);
        }
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing nerddinner


    【解决方案1】:

    ASP.NET MVC 支持约定优于配置。这意味着它将查找带有 Controller 后缀的控制器,而不是将其作为 URL 的一部分包含在内,而仅包含 Controller 的前缀。因此,如果你有 HomeController,你可以访问 /Home/,就像 DinnersController 的意思是 /Dinners/。这是 ASP.NET MVC 框架本身的一部分。

    如果您查看 Global.asax 中的默认路由,您会发现它使用的 URL 格式类似于...

    "{controller}/{action}/{id}"
    

    这意味着获取控制器的名称和操作的名称并将请求指向该方法。

    所以对于 DinnersController Index 操作方法,它看起来像 /Dinners/Index。

    【讨论】:

    • 所以它只是切断了名称为 DinnersController 的控制器,从而给了我晚餐?
    • 是的,它只使用Controller的前缀。
    • 谢谢。我一定在文章中遗漏了这一点。我得再读一遍。
    【解决方案2】:

    我面前没有示例,但我怀疑路由(请参阅Global.asax)设置为使用Dinners 作为默认控制器名称;负责的具体线路看起来像

    new { controller = "Dinners", action = "Index", id = "" }
    

    编辑:重新阅读问题,这并不能完全回答它;您感到困惑的问题是/dinners 已解决为DinnersController;不是任何默认行为。对于这种情况,Chad 的回答是正确的,正如您所说 - 框架基本上切断了 Controller 部分并计算出要映射的名称。

    【讨论】:

      【解决方案3】:

      这是 MVC 通过其默认路由为您提供的“隐式配置”(约定与配置)的一部分。

      当您访问“www.mysite.com/dinners”时,MVC 会自动在 URL 中看到“dinners”,并会查找名为“DinnersController”的控制器并调用“Index”方法。如果您访问“www.mysite.com/dinners/details”,MVC 会查找“DinnersController”并调用“Details”方法。

      如果您查看 ruby​​ on rails,它的行为方式大致相同(几乎可以肯定,这就是 Microsoft 的来源)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多