gpt4 book ai didi

ASP.NET 核心 : asp-* attributes use request payload over model?

转载 作者:行者123 更新时间:2023-12-05 00:54:40 24 4
gpt4 key购买 nike

似乎在 ASP.NET Core 中,asp-* 中的值属性(例如 asp-for )取自模型之前的请求负载。例子:

发布此值:

MyProperty="User entered value."

对于这个 Action :
[HttpPost]
public IActionResult Foo(MyModel m)
{
m.MyProperty = "Change it to this!";
return View();
}

或者这个 Action
[HttpPost]
public IActionResult Foo(MyModel m)
{
m.MyProperty = "Change it to this!";
return View(m);
}

View 呈现这个:
<input asp-for="MyProperty" />

表单输入中的值为 User entered value.而不是 Change it to this! .

首先,我很惊讶我们不需要将模型传递给 View 并且它可以工作。其次,令我震惊的是请求有效负载优先于传递到 View 中的模型。任何人都知道这个设计决定的基本原理是什么?有没有办法在使用 asp-for 时覆盖用户输入的值?属性?

最佳答案

我相信这是预期的行为/设计使然 .因为当您提交表单时,表单数据将存储到 ModelState 字典中,并且当 razor 呈现您的表单元素时,它将使用模型状态字典中的值。这就是为什么即使您没有将 View 模型的对象传递给 View(),您也会看到表单元素值的原因。方法。

如果要更新输入值,则需要明确清除模型状态字典。您可以使用 ModelState.Clear( ) 方法。

[HttpPost]
public IActionResult Create(YourviewModel model)
{
ModelState.Clear();
model.YourProperty = "New Value";
return View(model);
}

它使用模型状态字典来呈现表单元素值的原因是支持用例,例如在发生验证错误时在表单中显示先前提交的值。

编辑:我找到了 aspnet mvc 官方 github 存储库的链接,其中 this is confirmed作者:Eilon(asp.net 团队成员)

https://github.com/aspnet/Mvc/issues/4486#issuecomment-210603605

关于ASP.NET 核心 : asp-* attributes use request payload over model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com