为什么我的 ASP.NET Core POST 方法中的 URL 中的 id 参数没有更新?

问题描述 投票:0回答:1

我在 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。 预先感谢

c# asp.net-mvc asp.net-core post
1个回答
0
投票

实际上,当您通过单击提交按钮从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>

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.