ssm*_*ith 5 asp.net-mvc asp.net-mvc-areas webactivator
我想避免打电话
AreaRegistration.RegisterAllAreas()
在我的global.asax中,因为我试图将所有启动逻辑移动到App_Start文件夹中的各个类中.但是,我没有成功地让它发挥作用.第一个选项尝试使用这样的代码:
[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
public class Startup {}
}
Run Code Online (Sandbox Code Playgroud)
PreApplicationStartMethod来自System.Web名称空间的位置.在这种情况下,对寄存器区域的调用过早发生.
第二种方法基于David Ebbo的这篇文章,使用WebActivator:using System.Web.Mvc;
[assembly: WebActivatorEx.PostApplicationStartMethod
(typeof(AreaDemo.AreaConfig), "RegisterAreas")]
namespace AreaDemo
{
public class AreaConfig
{
public static void RegisterAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,尽管没有抛出错误,但尝试导航到该区域失败(好像注册从未发生过).
使用程序集指令而不是从Global.asax直接调用,从启动类中注册ASP.NET MVC 5中的区域的正确方法是什么?
更新1:这是我的AreaRegistration代码:
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "AreaDemo.Areas.Admin.Controllers" }
);
}
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,默认值被忽略,但导航到/ admin/home/index/0有效./ admin,/ admin/home和/ admin/home/index全部404.
我认为这是一个订购问题(您似乎也怀疑这一点)。我认为这些区域是在活动之后注册的,因此Application_Start区域的路线是在非区域路线之后注册的。
4 段 URL ( ) 起作用的原因/admin/home/index/123是它无法匹配 MVC 应用程序的“默认”路由。因此,该默认路由将被跳过(因为它仅匹配 1、2 和 3 段 URL),并且路由将查找可以处理 4 段 URL 的特定于区域的路由。1、2 或 3 段 URL 将匹配非区域路由,但当然区域之外没有控制器来处理此类 URL,因此返回 404。
Application_Start如果我理解正确的话,您希望在 之后但在发生任何“其他”事情之前注册这些区域?不幸的是,我不知道有任何具体的事件来处理这个问题。您也许IHttpModule可以尝试处理诸如 之类的事件BeginRequest,该事件发生得非常早,只需快速注册一次(也就是说,不要在每个请求上注册内容!),这应该允许您在 ASP 之前潜入.NET 路由完成它的工作(稍后发生,在 期间PostResolveRequestCache)。
一个完整的替代方案是使用属性route,很多人喜欢它,因为它可以帮助避免排序问题。
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |