Недавно столкнулся со следующей проблемой. Предположим, что у нас есть следующий контроллер с методом GET внутри:
[RoutePrefix("admin-panel")]
public class AdminPanelController : Controller
{
[Route("places/edit/{placeId}")]
public ActionResult EditPlace(int? placeId)
{
return View("EditPlace", new EditPlaceViewModel(...));
}
}
Теперь мы можем получить доступ к этому методу по URL:
(...)/админ-панель/места/редактировать/123
Проблема в том, что параметр placeId всегда имеет значение null.
Если я изменю правило маршрутизации метода EditPlace на следующее:
[RoutePrefix("admin-panel")]
public class AdminPanelController : Controller
{
[Route("places/{placeId}/edit")]
public ActionResult EditPlace(int? placeId)
{
return View("EditPlace", new EditPlaceViewModel(...));
}
}
Все начинает работать правильно - параметр placeId успешно передается.
Что мне здесь не хватает? Почему я не могу использовать первое решение?
Заранее спасибо!
@update
Хорошо, я пропустил, что у меня есть методы POST с теми же правилами маршрутизации, которые выглядят так:
[HttpPost]
[Route("places/edit/{placeId}")]
[MultipleSubmitButton(Name = "action", Argument = "NextEditStep")]
public ActionResult NextEditStep(int? placeId, EditPlaceViewModel model)
{
// do some operations with posted model
return View("EditPlace", new EditPlaceViewModel(...));
}
[HttpPost]
[Route("places/edit/{placeId}")]
[MultipleSubmitButton(Name = "action", Argument = "PreviousEditStep")]
public ActionResult PreviousEditStep(int? placeId, EditPlaceViewModel model)
{
// do some operations with posted model
return View("EditPlace", new EditPlaceViewModel(...));
}
Если я их закомментирую, проблема исчезнет, но, честно говоря, мне это нужно из-за генерации формы. Есть ли шанс использовать эти 3 метода с одинаковыми правилами маршрутизации?
У меня есть аналогичный контроллер с аналогичными 3 методами (1 GET и 2 POSTS), но у них нет параметров маршрута. В любом случае эта маршрутизация отлично работает и ведет себя так, как ожидалось. Разница лишь в том, что у первого есть параметры маршрута, а у второго нет.
[Route("places/add")]
и еще один с[Route("places")]
. - person smq93   schedule 23.03.2017admin-panel/places/edit/123
должен работать в соответствии с кодом, которым вы поделились. - person Shyju   schedule 23.03.2017{placeId:int?}
-[Route("places/edit/{placeId:int?}")]public ActionResult EditPlace(int? placeId)
? - person Win   schedule 23.03.2017placeId
является нулевым? - person mxmissile   schedule 23.03.2017EditPlace
,NextEditStep
иPreviousEditStep
имеют один и тот же шаблон маршрута и принадлежат одному и тому же контроллеру? - person Nkosi   schedule 24.03.2017AdminPanelController
, и все они имеют один и тот же шаблон маршрута[Route("places/edit/{placeId}")]
. Они ведут себя нормально, но параметр placeId всегда равен нулю в этих трех случаях. - person smq93   schedule 24.03.2017MultipleSubmitButton
для 2 методов POST, что позволяет мне отправлять форму по одному и тому же маршруту, но с разными действиями. Он также работает на другом контроллере, где мои методы GET и POST не имеют параметров Uri. Как я уже сказал, единственная проблема заключается в том, что параметры маршрута всегда нулевые. Просто взгляните: stackoverflow.com/a/7111222/5785985 - person smq93   schedule 24.03.2017RouteData
не устанавливается. следовательно, он нулевой. Проверьте отправленные данные. Держу пари, чтоplaceId
нет в словаре. Во всех показанных примерах используется маршрутизация на основе соглашений, а не маршрутизация по атрибутам. - person Nkosi   schedule 24.03.2017