ASP.NET области MVC: Как скрыть имя “области” в URL?

При выполнении MVC 2 примера областей, которые имеют область Блога и Контроллер Блога URL, похожи на это:

http://localhost:50526/Blog/Blog/ShowRecent в формате:

RootUrl / AreaName / ControllerName / ActionName

Только что обнаружив области MVC, это походит на отличный способ организовать код, т.е. создать область для каждого раздела, который в моем случае каждый раздел имеет свой собственный контроллер. Это означает что каждый AreaName = ControllerName. Эффект этого является двойным путем AreaName/ControllerName в URL, например,/Blog/Blog/выше

Не имея полное ясное понимание маршрутизации, как я мог установить маршрутизацию для не показа AreaName?

Править:

Я пытаюсь уменьшить объем работы с маршрутами, поскольку они, кажется, производят друг друга (т.е. требуют определенного упорядочивания) и могут вызвать сильные головные боли :-) В преобразовании существующего приложения веб-формы к MVC я преобразовал несколько базовых разделов, Они имеют один Контроллер каждый и изрядное количество Представления/Действий и хотя большая часть Доступа к данным является кодом, находится в блоках, которые выращивает количество классов Модели/Видеоданных... Я в настоящее время создаю подпапки в папках Root Models/Views для этих разделов (или области) и надеялся, что создание областей будет работать тот же путь кроме организации кода (с использованием основного маршрута, который покрывает область), Какой-либо комментарий к этому?

15
задан Mark Redman 21 April 2010 в 12:53
поделиться

2 ответа

Внутри папки каждой области вы увидите файл *AreaName*AreaRegistration.cs. В этом файле хранятся правила маршрутизации области. По умолчанию, когда они генерируются, они будут содержать имя области впереди всего остального. Проблема в том, что если убрать из маршрута имя области "folder", маршрут будет ловить все "стандартные" {controller}/{action}/{id} запросы. Что явно не то, чего вы хотите...

Чтобы преодолеть это, вы можете добавить regex-фильтры на маршруты, основанные на именах контроллеров, присутствующих в этом маршруте. Недостаток? Вы не сможете иметь два контроллера с одинаковым именем в приложении (по крайней мере, не используя стандартный маршрут). Вы всегда можете придумать другой маршрут для доступа к ним :) )

В итоге... Имея такую структуру:

/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

То, что у вас должно получиться, выглядит следующим образом: В BlogAreaRegistration.cs:

context.MapRoute(
    "Blog_default",
    "{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new { controller = "(Blog|Feed)" }
);

В UserAreaRegistration.cs:

context.MapRoute(
    "User_default",
    "{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new { controller = "(User)" }
);

В Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes)
{
    context.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);
}

Обратите внимание, что в global.asax регистрация областей идет первой! :)

UPD: На основании вашего вопроса обновляю: Есть одна важная вещь, которую вам придется принять во внимание, если вы будете использовать области: Если у вас есть межобластная связь, вам также придется указать название области в ссылке. Например,

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>

Вы поняли идею.

Что касается множественных моделей/представлений, на данный момент я придерживаюсь такой структуры

/Code/ // вспомогательные классы, классы расширения, которые не перемещены в библиотеки
/Models/Data/ // классы EF + классы валидации находятся здесь
/Models/ViewModels/{controller}/ // модели представлений хранятся для каждого контроллера

Пока все работает нормально, и мне удалось сохранить решение относительно организованным. Как я уже говорил, единственная область, которую я создал, это область Admin, потому что она так сильно отличается от остальной части сайта :)

20
ответ дан 1 December 2019 в 03:34
поделиться

Просто отвечу на ваш первоначальный вопрос, на случай, если кто-то еще читает это:

Не называйте ваш контроллер [по умолчанию] blog. Вот почему вы получаете blog/blog {area/controller}. Вы можете либо дать ему совершенно другое имя: например, blog/view, blog/posts, blog/recent и т.д., либо имя по умолчанию, например, home. В этом случае, если у вас также есть home в ваших контроллерах вне области, вы захотите использовать пространство имен вашего контроллера по умолчанию:

routes.MapRoute("Default",
  "{controller}/{action}/{id}",
  new { controller = "Home", action = "Index", id = UrlParameter.Optional},
  new[] { *appname*.Controllers" });

Это обеспечит, что "/" и "/blog" идут к соответствующему контроллеру "home". Если вы выполните поиск по ошибке дублирования контроллера home, вы найдете больше информации об этом.

1
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: