Вопрос в два раза.Во-первых, у вас есть действие RegisterDetails(Guid CustomerId)
с маршрутом, установленным через атрибут Route
.Это открывает его для принятия всех HTTP-глаголов: GET, POST и т. Д. Во-вторых, хотя вы не опубликовали свое представление, я могу предположить, что у вас, скорее всего, есть форма с пустым действием, например:
<form method="post">
...
</form>
По умолчанию будет отправляться обратно на ту же страницу, что здесь в этом сценарии будет /Register/Details/{CustomerId}
.Так как этот маршрут не соответствует вашему действию, явно помеченному как HttpPost
и , действующее действие принимает POST (из-за использования Route
), действие, которое принимает идентификатор клиента, вызывается снова.Поскольку в нем нет кода, который действительно обрабатывает сообщение, он просто перезагружает вашу страницу.
Прежде всего, вы должны использовать явные атрибуты HTTP-глагола вместо Route
в своих действиях, то есть:
[HttpGet("Register/Details/{CustomerId}")]
public IActionResult RegisterDetails(Guid CustomerId)
[HttpPost("Register/Details")]
public IActionResult RegisterDetails(Details Details)
Тогда, если вы хотите сохранить эту схему маршрутов, вам нужно четко указать свою форму.Однако, поскольку оба действия имеют одно и то же имя, это немного сложно сделать.ASP.NET Core попытается выполнить обратную засыпку части CustomerId маршрута, поскольку она уже существует в данных маршрута.У вас есть три варианта:
Использовать разные имена действий.Затем вы можете явно привязать свою форму к действию публикации:
[HttpPost("Register/Details")]
public IActionResult RegisterDetailsPost(Details Details)
Затем:
<form asp-action="RegisterDetailsPost" method="post">
Использовать названия маршрутов:
[HttpPost("Register/Details", Name = "RegisterDetailsPost")]
public IActionResult RegisterDetails(Details Details)
Тогда:
<form asp-route="RegisterDetailsPost" method="post">
Не включайте идентификатор клиента в начальный маршрут.Если два маршрута на самом деле совпадают, то будет выбран правильный путь, основанный на действующем глаголе HTTP.Другими словами:
[HttpGet("Register/Details")]
public IActionResult RegisterDetails(Guid CustomerId)
Вы все еще можете указать идентификатор клиента, но вам нужно использовать строку запроса, например, /Register/Details?CustomerId=123456
.Генерация URL в ваших ссылках и тому подобное не будет отличаться.ASP.NET Core автоматически присоединяет любые включенные данные маршрута, которые явно не являются параметром маршрута, в качестве параметра строки запроса.Другими словами, вы все равно можете просто сделать что-то вроде:
<a asp-action="RegisterDetails" asp-route-customerId="123456">Click me</a>