【问题标题】:ASP MVC4 Finding appropriate method in controllers with the same name in different areasASP MVC4在不同区域的同名控制器中找到合适的方法
【发布时间】:2012-03-07 23:46:02
【问题描述】:

我看过一些类似的问题,但我发现我有一个不同的问题。

我有一个 MVC4 项目,其中包含基础项目和 3 个区域中的控制器。每个区域都包含一个名为 AdminController 的控制器和一个方法 List。

我的问题是当我使用链接转到方法列表时总是通过同一个控制器(例如用户区域中的 AdminController)但返回的视图是正确的。

项目的结构是这样的:

  • Mimbre.Administration(web mvc4 项目)
    • 区域
      • 内容
        • 控制器
          • 管理员控制器
        • 型号
        • 查看次数
          • 管理员
            • 列表.chtml -ContentsAreaRegistration.cs
      • 日志
        • 控制器
          • 管理员控制器
        • 型号
        • 查看次数
          • 管理员
            • List.chtml
        • Lo​​gsAreaRegistration.cs
      • 用户
        • 控制器
          • 管理员控制器
        • 型号
        • 查看次数
          • 管理员
            • List.chtml
        • UsersAreaRegistration.cs
    • 控制器(基础项目)
    • 视图(基础项目)

区域注册的类包含像这样的RegisterArea方法(根据当前区域具有适当的名称和命名空间):

   public override void RegisterArea(AreaRegistrationContext context) {
        context.MapRoute(
            "Contents_default",
            "Contents/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new string[] { "Mimbre.Administration.Areas.Contents.Controllers" }
        );
    }

Global.asax 包含为基础项目注册路由的方法

        public static void RegisterRoutes(RouteCollection routes) {

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        AreaRegistration.RegisterAllAreas();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[]{"Mimbre.Administration.Controllers"}
        );
    }

在 index.chtml(在基础项目中)我创建了指向每个区域的 List 方法的链接:

<a href="@Url.Action("List", "Admin", new { area = "Contents"})" >Contents list</a>
<a href="@Url.Action("List", "Admin", new { area = "Logs"})" >Logs list</a>
<a href="@Url.Action("List", "Admin", new { area = "Users"})" >Users list</a>

在生成的 html 中,这些链接如下所示:

<a href="/Contents/Admin/List/">Contents list</a>
<a href="/Logs/Admin/List/">Logs list</a>
<a href="/Users/Admin/List/">Users list</a>

我认为这些链接是正确的,问题是任何点击的链接总是带我通过用户区域的 AdminController 中的方法列表,从不选择其他区域的 AdminController 中的方法列表。

这个问题可以通过重命名控制器的名称来解决,每个区域的名称都是唯一的,但是我真的需要在所有区域中保持相同的控制器名称,知道吗???

比提前!!!

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    我终于可以模拟你的问题了。我可以获得与您相同的输出的唯一方法(无论您尝试访问哪个区域,但到达相同的用户控制器并以正确的视图响应)是当您使用错误的控制器命名空间注册区域时。

    /Admin/Home/列表路由:

    namespace SandboxMvcApplication.Areas.Admin.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult List()
            {
                ViewBag.Message = "You've acessed Admin/List";
    
                return View();
            }
        }
    }
    

    /Admin/Home/列表视图:

    @{
        ViewBag.Title = "List";
    }
    
    <h1>Admin</h1>
    
    <h2>@ViewBag.Message</h2>
    

    行政区注册:

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new string[] { "SandboxMvcApplication.Areas.Admin.Controllers" }
        );
    }
    

    /User/Home/List 路由:

    public class HomeController : Controller
    {
        public ActionResult List()
        {
            ViewBag.Message = "You've accessed User/List";
    
            return View();
        }
    }
    

    /用户/主页/列表视图:

    @{
        ViewBag.Title = "List";
    }
    
    <h1>User</h1>
    
    <h2>@ViewBag.Message</h2>
    

    用户区注册:

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "User_default",
            "User/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new string[] { "SandboxMvcApplication.Areas.Admin.Controllers" }
        );
    }
    

    使用此配置,我的输出是:

    1. /Admin/Home/列表

      管理员

      您已访问管理/列表

    2. /用户/主页/列表

      用户

      您已访问管理/列表

    请注意,第一个单词可以正常工作(确保呈现了正确的视图,但来自列表操作的数据错误)。

    如果我更正 UserAreaRegistration 中的用户控制器命名空间(“SandboxMvcApplication.Areas.User.Controllers”),一切正常!

    看看这是否对您有帮助,或者尝试将您的命名空间显式放置到正确的控制器中。您还可以检查 Admins 控制器是否也具有正确的命名空间。

    【讨论】:

    • Felipe,感谢您的回答,但是 AreaRegistration 类具有正确的命名空间,我不知道这是否是 mv4 beta 版本的问题,暂时我不得不重命名控制器,每个区域的名称不同。
    【解决方案2】:

    您需要在路线注册中再添加一项设置。这将防止 DefaultControllerFactory 在非预期区域搜索控制器。

            routes.MapRoute( 
            name: "Default", 
            url: "{controller}/{action}/{id}", 
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
            namespaces: new string[]{"Mimbre.Administration.Controllers"} 
        ).DataTokens["UseNamespaceFallback"] = false; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多