Я бы не хотел звонить
AreaRegistration.RegisterAllAreas ()
в моем global.asax, потому что я пытаюсь переместить всю логику запуска в отдельные классы внутри папки App_Start. Однако мне не удалось заставить это работать. Первый вариант попытался использовать такой код:
[assembly: PreApplicationStartMethod(typeof(Startup), "PreInit")]
namespace Foo
{
public class Startup {}
}
Где PreApplicationStartMethod исходит из пространства имен System.Web. В этом случае вызов на регистрацию участков происходит слишком рано.
Второй подход, основанный на этой публикации Дэвида Эббо, использует WebActivator: using System.Web.Mvc;
[assembly: WebActivatorEx.PostApplicationStartMethod
(typeof(AreaDemo.AreaConfig), "RegisterAreas")]
namespace AreaDemo
{
public class AreaConfig
{
public static void RegisterAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
}
К сожалению, хотя ошибка не возникает, попытка перейти в область не удалась (как будто регистрация никогда не происходила).
Как правильно регистрировать области в ASP.NET MVC 5 из класса запуска с использованием директивы сборки, а не прямого вызова из Global.asax?
Обновление 1: вот мой регистрационный код области:
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" }
);
}
}
По какой-то причине значения по умолчанию игнорируются, но переход в / admin / home / index / 0 работает. / admin, / admin / home и / admin / home / index все 404.