c# - 属性路由 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?}");
});
解决方案
第一个问题:不要使用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?}");
推荐阅读
- javascript - axios JWT 登录前端请求后端
- python - Python Pandas 改进了目前需要约 400 分钟运行的大型数据集的计算时间
- ios - 使用 plutil/PlistBuddy 从 Info.plist 中删除 dict 条目
- c - C 程序无法在 mongoose os 中构建(第一次使用 c)
- python - 如何禁用在 Python 3 中触发输入的回车键?
- python - 熊猫数据框找到平均值
- rest - REST:不希望父 ID 可见时的嵌套资源 url
- sql - 使用分区聚合某些行的总和
- module - ModuleNotFoundError:使用 Spyder
- php - 通过ajax调用将参数传递给控制器中的方法