首页 > 解决方案 > 属性路由 ASP.NET Core

问题描述

我曾尝试了解 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?}");
  });

标签: c#asp.net-core

解决方案


第一个问题:不要使用action="url",使用 ASP.NET Core 属性,这些属性会为您生成正确的 URL,同时还确保 AntiForgeryToken 出现在表单中:

<form asp-controller="Address" asp-action="Save">

第二个问题:[FromBody]用于在请求正文中发送数据,最常见的是 JSON,并且您使用的是表单内容。

public IActionResult Save(Address address)

第三个问题:不要同时使用[Route]and [Http*],最好只使用其中一个

[HttpPost("/Address/Save")]

第四个问题:这个配置意味着/会去Address/Create/Home会去/Home/Create,那是一个很奇怪的模板:

template: "{controller=Address}/{action=Create}/{id?}");

我建议您保留原始索引操作(或任何您想调用的操作)并将您的启动 URL 设置为/Address/Create.

template: "{controller=Address}/{action=Index}/{id?}");

推荐阅读