网络核心中名为 newuserid 的属性上的模型绑定不起作用


这是一个非常奇怪的问题,我已经讨论了两三天了。 我正在使用 Net Core 6.0 MVC Web 应用程序。

在我的视图模型中,我有一个这样的属性:

public class ConfirmCodeViewModel
{
...
public long NewUserId { get; set; }
...
}

模型被填充,被传递到视图中,并且该值被保存在表单内的隐藏输入中,所有这些都是非常标准的东西:

@model ConfirmCodeViewModel
...
<form asp-action="ConfirmCode" method="post">
...
<input type="hidden" asp-for="NewUserId" />
...
</form>

当表单被发布时,NewUserId 返回为零,发布的表单数据中没有它的条目,因此它不绑定到传入模型。

如果我将属性名称更改为 UserId

public long UserId { get; set; }

然后它绑定并正确返回。

该模型在操作中是这样接收的:

public async Task<IActionResult> ConfirmCode(ConfirmCodeViewModel inputModel)

所有其他模型属性均正确绑定。

这解决了问题,但我仍然想找出为什么它不适用于名为 NewUserId 的属性。

非常感谢您的任何意见。

PS 如果代码的格式有点奇怪,我很抱歉,我的无能!

我尝试过的:

我尝试将类型更改为字符串

public string NewUserId { get; set; }

但这也不起作用。

我检查了传入的 Request.Form 集合,没有返回名为 NewUserId 的项目。

我已检查视图以确保不存在具有相同 ID 的重复元素。

我已经验证(使用 JS)该值是在视图中设置的。

POST 不会被以任何方式拦截(例如通过 JS)。

解决方案1

在我看来,最明显需要调查的事情是 POST 调用的服务器端预期的属性名称。 验证是否名为NewUserId。 我怀疑它实际上被称为 UserId,您在发送值时会收到它。 如果该属性名为 UserId,并且您仍想在本地使用 NewUserId,则始终可以使用您在另一端期望的名称来修饰该属性(本示例使用 NewtonSoft)。

C#
[JsonProperty("UserId")]
public long NewUserid { get; set; }

解决方案2

感谢您的回复,非常感谢。 您几乎反映了我自己的想法,考虑到隐藏字段位于表单等内部,名称差异是最可能的原因。

该属性是模型的一部分,在所有地方(例如模型本身、视图等)都称为 NewUserId。 还有几个附加属性都可以很好地绑定,只有 NewUserId 失败。

通过将名称全部更改为 UserId,一切正常。 将属性名称始终更改为 TestUserId 也可以正常工作。

我使用 ASP 已经有一段时间了,从来没有遇到过这样的问题,就好像名称本身被某种方式禁止了一样!

コメント

タイトルとURLをコピーしました