为什么Asp.Net MVC 3在不使用Url中的区域名称的情况下从区域中的Controller路由到Action?怎么预防呢?

时间:2013-01-02 15:55:22

标签: asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-routing

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

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错误)

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

Route route = routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}",
    new[] { "APS.EIMS.UI.WhateverInNoArea" }
);
route.DataTokens["UseNamespaceFallback"] = false;