便携式区域具有相同的控制器/文件夹



我正在使用MVC 3,而MVC贡献具有便携性区域。问题是,便携式区域具有类似的视图(例如,家庭,用户管理...)。

例如,每个便携式区域都有一个家庭视图(视图/home/index.cshtml)和一个家庭控制器(控制器/home.cs)。设置了路由,以便访问页面,我将转到mySite/portableAreAname/controller/view。

问题是它仅加载第一个便携式区域的房屋和用户管理页面。它发现该视图首先,然后将其加载,无论URL中指定的区域如何。

我只能将所有内容前缀(例如Area1home,aket1usermanagement),但我宁愿找到一个更可扩展的解决方案。如果我们获得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
    );
}

Portable区域> myportableAregistration.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/content/images
  • myportablearea/脚本

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

更新2

上一个修复程序无效。即使上面的代码仍然有时仍然会加载错误的视图,资源等。有人知道如何解决此问题吗?

当我调试时,它将转到该控制器中的正确控制器和正确的视图,但是加载了错误的视图(例如,将其放在Area2的Controller和Area2的主页方法上,但是加载了Area 1的主页。

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

myportableArea1/controls/home,myportableArea1/scripts/views/home/index.jsmyportableArea2/controls/home,myportableArea2/scripts/views/home/index.js

我认为这是因为它立即注册它们吗?然后,当它找到路线的匹配项时,它使用了第一个匹配(有时是错误的)。

更新3

踏入代码后,我的布局中的各个部分似乎是未正确加载的部分。例如,它到达MyPortableArea2的homecontroller> index(),加载布局,然后布局将myportableArea1的内容加载在@renderbody()部分中。

更新4

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

更新5

所以我进行了一些测试,并弄清楚了为什么它加载错误的页面:它根本找不到该区域。就像甚至不在系统中!

例如。PortableArea1/home/index

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

例如。PortableArea2/home/index

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

当它加载错误的页面时,我现在遇到一个错误,说找不到该视图。为什么不加载我的便携式区域?

您可能需要覆盖registerAreas(),并为每个区域实现registerRoutes()。

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

希望它有帮助。

这可能是您所在地区_ViewStart.cshtml文件的结果。这是一个鲜为人知的文件,其中有一个指令:

@{
 Layout = "~/someurl";
}

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

最新更新