【问题标题】:Portable Areas have Same Controller/Folders便携式区域具有相同的控制器/文件夹
【发布时间】:2012-10-30 03:44:03
【问题描述】:

我正在使用 MVC 3 和 MVC Contrib 来创建可移植区域。问题是,便携式区域具有相似的视图(例如主页、用户管理...)。

例如,每个可移植区域都有一个 Home 视图 (Views/Home/Index.cshtml) 和一个 Home Controller (Controllers/Home.cs)。设置路由以便访问该页面,我会转到 MySite/PortableAreaName/Controller/View。

问题在于它只加载第一个便携式区域的主页和用户管理页面。它首先找到该视图,然后加载它,而不考虑 URL 中指定的区域。

我可以只为所有内容添加前缀(例如 Area1Home、Area1UserManagement),但我宁愿找到一个更具可扩展性的解决方案。如果我们有 50 多个可移植区域,每个区域有 10 个视图,我们要么必须跟踪我们使用的视图名称,要么为每个视图添加前缀。

有什么建议吗?如果您需要更多信息,请告诉我。

更新 1 - 无效

使用 twang 提供的文章解决,并将以下代码添加到主项目(链接文章中的“PortableAreas”)。

文章:http://elegantcode.com/2012/04/06/mvc-portable-areas/

主项目 > Global.asax.cs

protected void Application_Start()
{
    // ...
    AreaRegistration.RegisterAllAreas();
    PortableAreaRegistration.RegisterEmbeddedViewEngine();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    // ...
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Login", action = "Index", id = UrlParameter.Optional },
        new string[] { "PortableAreas.Controllers" } // main project namespace
    );
}

便携式区域 > MyPortableAreaRegistration.cs

public class MyPortableAreaRegistration : PortableAreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "MyPortableArea";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
    {
        RegisterRoutes(context);
        RegisterAreaEmbeddedResources();
    }

    private void RegisterRoutes(AreaRegistrationContext context)
    {
        context.MapRoute(
            AreaName + "_default",
            base.AreaRoutePrefix + "/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new[] { "MyPortableArea.Controllers", "MvcContrib" }
        );
    }
}

据我了解,以下位置是资源的默认位置:

  • MyPortableArea/内容/图像
  • MyPortableArea/脚本

只要您将资源保存在这些文件夹中,就不应注册它们。

更新 2

之前的修复不起作用。即使使用上面的代码,它有时仍然会加载错误的视图、资源等。有人知道如何解决这个问题吗?

当我调试时,它会转到正确的控制器和该控制器内的正确视图,但会加载错误的视图(例如,使其进入区域 2 的控制器和区域 2 的主页方法,但加载区域 1 的主页。强>

例如我有 2 个便携式区域,但它总是加载第一个

MyPortableArea1/Controls/Home, MyPortableArea1/Scripts/Views/Home/index.js MyPortableArea2/Controls/Home, MyPortableArea2/Scripts/Views/Home/index.js

我认为是因为它同时注册了所有这些?然后当它找到路由的匹配项时,它使用第一个匹配项(有时是错误的)。

更新 3

单步执行代码后,我的布局中的部分似乎没有正确加载。例如,它到达 MyPortableArea2 的 HomeController > Index(),加载布局,然后布局在 @RenderBody() 部分加载 MyPortableArea1 的内容。

更新 4

http://mvccontrib.codeplex.com/ 更新到最新版本的 MvcContrib。这不起作用。

更新 5

所以我做了一个小测试并弄清楚为什么它加载了错误的页面:它根本找不到区域。好像连系统里都没有!

例如PortableArea1/首页/索引

public ActionResult Index()
{
    return View("~/Areas/PortableArea1/Views/Home/Index.cshtml");
}

例如PortableArea2/首页/索引

public ActionResult Index()
{
    return View("~/Areas/PortableArea2/Views/Home/Index.cshtml");
}

当它加载错误的页面时,我现在收到一条错误消息,提示找不到视图。为什么它没有加载我的便携式区域??

【问题讨论】:

    标签: c# asp.net-mvc-3 mvccontrib portable-areas


    【解决方案1】:

    您可能想要覆盖 RegisterAreas(),并为每个区域实现 RegisterRoutes()。

    这里有一篇很好解释的文章:http://elegantcode.com/2012/04/06/mvc-portable-areas/

    希望对你有帮助。

    【讨论】:

    • 我能够让它工作,但在我的主要项目(链接文章中的“PortableAreas”)中,我的所有便携式区域都需要访问这些视图。如果我完全按照那篇文章从我的主项目中删除 RegisterRoutes,它可以工作,但会破坏所有主项目 url(例如 MySite/MainProjController/MainProjView)。
    • 有时这行得通,有时却不行。我认为这与需要重置的应用程序池或 IIS 有关,但我不确定。有什么想法吗?
    【解决方案2】:

    这可能是您区域的_ViewStart.cshtml 文件的结果。这是一个鲜为人知的文件,其中包含一个指令:

    @{
     Layout = "~/someurl";
    }
    

    这将定义该区域内每个视图的基本页面加载位置。该文件与该区域的web.config 文件在同一范围内。

    【讨论】:

    • 到目前为止这似乎有效,但我要给它更多时间(一周左右)。
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2023-04-07
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多