[ad_1]
这是一个非常奇怪的问题,我已经讨论了两三天了。 我正在使用 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)。
[JsonProperty("UserId")] public long NewUserid { get; set; }
解决方案2
感谢您的回复,非常感谢。 您几乎反映了我自己的想法,考虑到隐藏字段位于表单等内部,名称差异是最可能的原因。
该属性是模型的一部分,在所有地方(例如模型本身、视图等)都称为 NewUserId。 还有几个附加属性都可以很好地绑定,只有 NewUserId 失败。
通过将名称全部更改为 UserId,一切正常。 将属性名称始终更改为 TestUserId 也可以正常工作。
我使用 ASP 已经有一段时间了,从来没有遇到过这样的问题,就好像名称本身被某种方式禁止了一样!
[ad_2]
コメント