Маршрутизация MVC3 работает только 1 направление
Я работаю над сайтом ASP.NET mvc 3, который содержит несколько сущностей проекта, а затем у каждого проекта есть несколько связанных подстраниц, каждая из которых работает с компонентом проекта.
Например, у меня может быть проект с несколькими фотографиями, вехами, информацией о пользователе и т. Д. У меня есть представление "Индекс проекта", а также "Домашняя страница проекта", которая ссылается на несколько страниц компонентов. Большинство компонентов имеют два представления: индекс и редактирование / просмотр.
Поэтому я настроил маршрут для правок и просмотров. Обратите внимание, что мой маршрут находится в области под названием ProjectManagement
context.MapRoute(
"ProjectManagement_ProjectPageSingle",
"ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
new { controller = "Project", action = "Home" }
);
и все действия моего контроллера выглядят примерно так:
public ActionResult Edit(string projectNumber, string projectChildId)
Это хорошо работает, когда я набираю URL прямо в браузере. Например:
~/ProjectManagement/Milestone/Edit/39999P110175/1
однако, когда я генерирую ссылку действия, используя:
<a href="@Url.Action("Edit", new { projectNumber = Model.Project.ProjectNumber, projectChildId = entry.Id})">
URL действия выглядит примерно так:
~/ProjectManagement/Milestone/Edit/39999P110175?projectChildId=1
Итак, маршрут работает... но генератор ссылок действий не работает? Не уверен, куда идти отсюда. Любые советы будут высоко ценится.
Обратите внимание, что то же самое происходит при использовании @Html.ActionLink вместо @Url.Action.
Спасибо!
2 ответа
Спасибо Майклу за ответ. Вот ответ для других.
Я имел:
context.MapRoute(
"ProjectManagement_ProjectPage",
"ProjectManagement/{controller}/{action}/{projectNumber}",
new { controller = "Project", action = "Home"}
);
///more routes
context.MapRoute(
"ProjectManagement_ProjectPageSingle",
"ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
new { controller = "Project", action = "Home" }
);
URL также соответствовал маршруту ProjectPage, поэтому сначала он был выбран. Пришлось перевернуть заказ, поэтому более конкретный маршрут пришел первым.
Благодарю.
Вы не указали название области:
@Url.Action(
"Edit",
new {
projectNumber = Model.Project.ProjectNumber,
projectChildId = entry.Id,
area = "ProjectManagement"
}
)
Также убедитесь, что нет никаких других маршрутов, которые могут конфликтовать с этим при регистрации вашего региона, который должен выглядеть следующим образом:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"ProjectManagement_default",
"ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
new { controller = "Project", action = "Home" }
);
}