Маршрутизация атрибутов ASP.NET Core - PullRequest
0 голосов
/ 10 апреля 2019

Я пытался узнать систему маршрутизации атрибутов в 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?}");
  });

1 Ответ

1 голос
/ 10 апреля 2019

Первая проблема: не используйте 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?}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...