我正在使用 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/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");
}
当它加载错误的页面时,我现在收到一条错误消息,提示找不到视图。为什么它不加载我的便携式区域?