我正在使用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
文件的范围相同。