【问题标题】:why does Asp.Net MVC 3 route to an Action from a Controller in an Area without using the area name in Url? how to prevent it?为什么 Asp.Net MVC 3 在不使用 Url 中的区域名称的情况下从区域中的控制器路由到操作?如何预防?
【发布时间】:2013-01-02 15:55:21
【问题描述】:

我刚刚意识到 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 错误)

【问题讨论】:

  • 您必须设置一条路线以将该网址指向该区域。安装路由调试器。它会告诉你哪些路线被击中。从那里,您应该能够调整/删除违规路线。

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


【解决方案1】:

你可能会有一个像默认路由一样的路由:

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;

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多