我在 ASP.NET Core 中有一个 POST 方法,它从 URL 中获取 id 参数。当我更改 URL 中的 id 并提交表单时,POST 方法中的 id 不会反映 URL 中的更新值。
我的观点证明我的表单中没有 Id 字段。 @model GenreUpdateVM
<form method="post">
<input asp-for="Name" />
<span asp-validation-for="Name" style="color:red"></span>
<button type="submit">Update</button>
<a asp-action="index">Cancel</a>
</form>
我的 get int id 来自 Route,对吗?
[HttpGet]
public async Task<IActionResult> Update(int id)
{
var request = new RestRequest($"Genres/{id}", Method.Get);
var response = await _restClient.ExecuteAsync<ApiResponseMessage<GenreUpdateVM>>(request);
if (!response.IsSuccessful)
{
TempData["Err"] = response.Data.ErrorMessage;
return RedirectToAction(nameof(Index));
}
return View(response.Data.Data);
}
准确来说是从这里开始
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
我的 POST 方法怎么样?
[HttpPost]
public async Task<IActionResult> Update(int id, GenreUpdateVM vm)
{
var request = new RestRequest($"Genres/{id}", Method.Put);
request.AddJsonBody(vm);
var response = await _restClient.ExecuteAsync<ApiResponseMessage<object>>(request);
if (!response.IsSuccessful)
{
ModelState.AddModelError(response.Data.PropertyName, response.Data.ErrorMessage);
return View();
}
return RedirectToAction(nameof(Index));
}
为什么当我更改路由中的 id 时,我的 POST 方法仍然从 GET 方法获取值?
例如:/Home/Update/4 这是我在 GET 部分时的样子,但后来我将其更改为 /Home/Update/10,并且我期待错误,因为我没有任何 ID 10,但它仍然更新了 ID 4 的那个。帮助我了解路由、传递和绑定在 ASP MVC 中是如何工作的。
预期行为:查看后,我手动将 URL 上的 id 号从 4 更改为 10,因此我的 POST 方法应该得到 (int Id=10)
实际行为:我对 Id 的更改不会影响传递给 POST 方法的 id。它仍然获得旧值 4。 预先感谢
实际上,当您通过单击提交按钮从form标签发布请求时,它不会自动添加url数据,您也不会修改post url。
post url 就像
post https://localhost:7072/home/update
一样,您从 get 方法中提供的 url 参数 10 不会添加到其中。
为了解决这个问题,我建议你可以使用viewbag将id传递给视图,然后使用输入隐藏字段来存储id值,然后表单标签post将在你单击按钮时添加id值。
更多详情,您可以参考下面的例子:
控制器:
[HttpGet]
public async Task<IActionResult> Update(int id)
{
//var request = new RestRequest($"Genres/{id}", Method.Get);
//var response = await _restClient.ExecuteAsync<ApiResponseMessage<GenreUpdateVM>>(request);
//if (!response.IsSuccessful)
//{
// TempData["Err"] = response.Data.ErrorMessage;
// return RedirectToAction(nameof(Index));
//}
// Pass the id to the view
ViewBag.Id = id;
return View(/*response.Data.Data*/);
}
[HttpPost]
public async Task<IActionResult> Update(int id, GenreUpdateVM vm)
{
//var request = new RestRequest($"Genres/{id}", Method.Put);
//request.AddJsonBody(vm);
//var response = await _restClient.ExecuteAsync<ApiResponseMessage<object>>(request);
//if (!response.IsSuccessful)
//{
// ModelState.AddModelError(response.Data.PropertyName, response.Data.ErrorMessage);
// return View(vm); // Pass the model back to the view
//}
return RedirectToAction(nameof(Index));
}
查看:
@model GenreUpdateVM
<h1>Update</h1>
<form method="post">
<!-- Add a hidden input field to pass the id -->
<input type="hidden" name="id" value="@ViewBag.Id" />
<input asp-for="Name" />
<span asp-validation-for="Name" style="color:red"></span>
<button type="submit">Update</button>
<a asp-action="index">Cancel</a>
</form>
结果: