1

我刚刚意识到 MVC 3 和 4 Routing 可以配置作为区域一部分的操作的路径,而无需命名区域名称,但它们不返回视图。例如看下面的代码:

namespace APS.EIMS.UI.Areas.Admin
{
    public class TestController : BaseController
    {

        public ActionResult Index()
        {
            return View();
        }

        public JsonResult GetNames()
        {
            var dc = GetDataContext();
            var result = from m in dc.Db<IMS_Reject>()
                         select new { m.Id };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

    }
}

每当我尝试//localhost/Test/Index它找不到索引视图但可以将路径路由到该区域中的操作(它适用于//localhost/admin/test/index正如我所期望的那样)。我也为//localhost/admin/test/getnames//localhost/test/getnames得到相同的结果。为什么它会这样?它如何找到没有区域名称的动作?我需要在我正在开发的应用程序中防止这种情况发生,这可能吗?(我的意思是仅在地址完整时路由,否则出现 404 错误)

4

1 回答 1

2

您可能会有一条类似于默认路线的路线:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);

因此,像//localhost/Test/Index这样的 URL将与该默认路由匹配,如您所见,它将正确找到控制器,但找不到视图。默认情况下,控制器工厂将在应用程序中查找具有请求名称的任何控制器类,无论它位于何处。

如果您在默认路由中显式设置命名空间并告诉 MVC 不要在其他命名空间中查找控制器,则可以防止这种情况发生。

这是通过使用 MapRoute 重载来完成的,该重载采用带有命名空间的字符串数组并显式禁用该路由的命名空间回退。(如果不禁用命名空间回退,您只会优先考虑这些命名空间,以防找到多个具有相同名称的控制器)。

这可能看起来像这样(我设置了一个命名空间,但您可以根据需要设置任意数量):

Route route = routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}",
    new[] { "APS.EIMS.UI.WhateverInNoArea" }
);
route.DataTokens["UseNamespaceFallback"] = false;
于 2013-01-03T08:04:50.887 回答