#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-areas
#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-areas
Вопрос:
Я добавил область в свой проект MVC 3. Кажется, я не могу заставить маршрутизацию работать с очень простым сценарием. Кажется, что он всегда хочет разрешаться в область. Вот моя конфигурация. При запуске:
AreaRegistration.RegisterAllAreas();
IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Browse", action = "Index", id = UrlParameter.Optional }
И
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 = "Users", action = "Index", id = UrlParameter.Optional }
);
}
}
В web.config:
<authentication mode="Forms">
<forms loginUrl="~/Login" defaultUrl="~/Browse" timeout="60" cookieless="UseDeviceProfile" />
</authentication>
Я использую RouteDebugger, чтобы попытаться решить эту проблему. Когда я перехожу на страницу входа в систему, отладчик показывает:
- Путь к файлу AppRelativeCurrentExecutionFilePath: ~Login
- Администратор / {контроллер} / {действие} / {идентификатор} Не соответствует текущему запросу
- {контроллер} / {действие} / {идентификатор} Соответствует текущему запросу
- Согласованный маршрут: {контроллер} / {действие} / {идентификатор}
Пока все хорошо. Но затем он показывает это:
- Сгенерированный URL: /Admin/Login?returnUrl=/ с использованием маршрута «Admin /{controller}/{action}/{id}»
Затем я вхожу в систему. Мой метод входа / индексации не выполняется, и отладчик показывает:
- Путь к файлу AppRelativeCurrentExecutionFilePath: ~Login
- Администратор / {контроллер} / {действие} / {идентификатор} Не соответствует текущему запросу
- {контроллер} / {действие} / {идентификатор} Соответствует текущему запросу
- Согласованный маршрут: {контроллер} / {действие} / {идентификатор}
- Сгенерированный URL: /Admin/Login?returnUrl=/Admin/Login с использованием маршрута «Admin /{controller}/{action}/{id}»
С одной стороны, он говорит, что он не соответствует маршруту администратора, затем в сгенерированном URL-адресе говорится, что он использует этот маршрут. Я в тупике.
Ответ №1:
Попробуйте добавить свой параметр area с предопределенным значением в ваше определение маршрутизации… Например, вместо:
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Users", action = "Index", id = UrlParameter.Optional }
);
используйте:
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { area = "Admin", controller = "Users", action = "Index", id = UrlParameter.Optional }
);
Дайте мне знать, если это поможет…
С уважением
Комментарии:
1. Я сделал именно так, как вы говорите. Сначала я попытался выполнить регистрацию области перед регистрацией, не относящейся к области. Ничего хорошего. Ссылки на контроллер, не относящийся к области, всегда разрешаются с помощью «Admin /» перед ними. Поэтому я изменил порядок регистрации. Затем, когда я перехожу к «~ / Admin», я получаю «~ / Home / NotFound», при этом отладчик показывает совпадение с маршрутом «{controller} / {action} / {id}». Когда я перехожу к «~/Admin / Users», я получаю «~ /Admin / Home/ Home / Home / NotFound», при этом отладчик показывает совпадение по маршруту {catchall}.
2. Когда я говорю «Ссылки на контроллер, не относящийся к области, всегда разрешаются с помощью ‘Admin /’ перед ними», это не совсем верно. HTML. ActionLink<T> разрешается правильно. Но Html.BeginForm<T> и Html.BuildUrlFromExpression<T> преобразуются в область администратора, даже если T является контроллером, которого НЕТ в области.
3. Я использовал версию Microsoft.Web.Mvc 2.0, в которой эти методы не понимают области. Это исправлено в версии 3.0.