Меня пытались узнать о системе маршрутизации атрибутов в ASP.NET Core. У меня есть следующие коды, и я хотел бы знать, почему мой метод сохранения в контроллере не срабатывает при публикации формы: -
HTML-код: -
<form method = "post" action = "/Address/Save">
<label asp-for = "Street">Street:</label>
<input type = "text" asp-for = "Street" />
<label asp-for = "City">City:</label>
<input type = "text" asp-for = "City" />
<input type = "submit" value = "Submit" />
</form>
Мой код контроллера адреса следующий: -
public class AddressController : Controller
{
public List<Address> addresses { get; set; } = new List<Address>();
[HttpGet()]
public IActionResult Create()
{
return View(new Address());
}
[Route("/Address/Save")]
[HttpPost()]
public IActionResult Save([FromBody] Address address)
{
//codes removed for brevity
}
public IActionResult Privacy()
{
return View();
}
}
начальная конфигурация маршрутизации
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Address}/{action=Create}/{id?}");
});
Ссылка Настройка поведения привязки модели с помощью атрибутов
[Route()]
Атрибут, обычно используемый в имени контроллера.
Первая проблема: не используйте action = "url"
, используйте атрибуты ASP.NET Core, они генерируют для вас правильный URL-адрес, а также обеспечивают присутствие AntiForgeryToken в форме:
<form asp-controller = "Address" asp-action = "Save">
Вторая проблема: [FromBody]
используется для отправки данных в теле запроса, чаще всего в формате JSON, а вы используете содержимое формы.
public IActionResult Save(Address address)
Третья проблема: не используйте и [Route]
, и [Http*]
, лучше используйте только один из них.
[HttpPost("/Address/Save")]
Четвертая проблема: эта конфигурация означает, что /
пойдет на Address/Create
, а /Home
пойдет на /Home/Create
, это очень странный шаблон:
template: "{controller=Address}/{action=Create}/{id?}");
Я бы посоветовал вам сохранить исходное действие Index (или как вы хотите его назвать) и установить URL-адрес запуска на /Address/Create
.
template: "{controller=Address}/{action=Index}/{id?}");
Удалить атрибут
[FromBody]