为什么ASP.Net MVC2区域控制器操作可以调用而不包括url路径中的区域?

时间:2010-04-18 17:38:36

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

我刚刚安装了Visual Studio 2010并创建了一个新的MVC2项目,以便我可以了解更改和更新,并发现了一些我不确定要做什么的方面的问题。

  1. 我创建了一个新的EMPTY MVC2项目
  2. 我右键单击了该项目,并从上下文菜单中添加了一个名为“Test”的新区域
  3. 在新的测试区域,我添加了一个名为“Data”的控制器。
  4. 代码是:

    public class DataController : Controller
    {
        //
        // GET: /Test/Data/
    
        public ActionResult Index()
        {
            Response.Write("Hi");
            return new EmptyResult();
        }
    }
    

    现在,我编译并调用此地址: http://localhost/mytest/test/data并获得输出:

    Hi
    

    一切都好。现在我称之为:http://localhost/mytest/data并获得相同的响应!我以为路由应该照顾这个?我忽略了什么吗?或者MVC2的默认项目设置忽略了什么?

1 个答案:

答案 0 :(得分:2)

这是故意的。 Global.asax中的默认路由不会将其搜索限制为特定区域或命名空间集。 MapRoute的重载(请参阅one example on MSDN)带有名称空间参数,该参数可用于消除此请求所指的控制器的歧义。但即便如此, namespaces 参数只是提示要先搜索哪些名称空间;这不是限制。

简而言之,在MVC中,您必须为任何路由器击中任何控制器做好准备。这就是为什么所有MVC文档都声明安全性和其他逻辑应该在控制器级别完成,而不是在路由级别。