gpt4 book ai didi

c# - ASP.NET MVC 3 - 在 View 中处理模型的最佳实践

转载 作者:太空狗 更新时间:2023-10-29 23:34:09 25 4
gpt4 key购买 nike

我正在使用 ASP.NET MVC 3 并且有几个页面,其中大部分 View 模型是只读的。一个示例字段是这样的:

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>

然后我有一个字段,用户必须在其中输入一些验证文本,如下所示:

@Html.LabelFor(model => model.Verification)
@Html.PasswordFor(model => model.Verification)

当用户提交表单并点击我的 Controller 时,ViewModel 的字段都为 null,除了 Verification 字段。到目前为止,我解决这个问题的方法是有几个像这样的 HiddenFor 字段:

@Html.HiddenFor(model => model.MyField)

但是,这很快就会变得丑陋。有没有更好的方法来处理 View 状态中的模型,以便在表单提交的 POST 期间,我可以获得我的所有字段?这很重要,以防验证文本在 POST 期间不匹配,我需要返回 View 模型而不从数据库中重新检索它。

感谢您的任何建议。

最佳答案

如果不从数据库中重新检索值,没有更好的解决方法。原因是因为 MVC 的模型绑定(bind)只查看 GET 或 POST 参数以将 MyField 绑定(bind)到操作的模型,如果 GET/POST 参数没有 MyField value 那么它必须将该属性保持为 null(否则它如何知道该值应该是什么?)

为了让模型绑定(bind)器看到您的 MyField 值是在 GET/POST 参数中传递它,为此您必须明确告诉您的 View 的表单通过传递值Html.HiddenFor()。 View 无法自动知道在 post/get 参数中发送该属性。

但是您可以考虑的一个想法是创建一个 Razor(或 Html)辅助方法,该方法采用字段名称和表达式(x => x.MyField) 并为您编写以下输出:

<div class="display-label">My Field</div>
<div class="display-field">@Model.MyField</div>
@Html.HiddenFor(model => model.MyField)

这意味着您只需编写一行代码(类似于 @Html.ShowReadOnlyField(x => x.MyField, "My Field") 而不是那 3 行代码。但是,这还假定您要执行此操作的任何地方都将具有相同的 div 结构。

编辑:请记住只读字段的安全问题,因为它们不是真正只读的。如果出现这种情况,最好从数据库中重新检索这些数据data 将用于 Controller 中的任何内容,因为即使它在 HTML 表单中是只读的,用户仍然可以通过操作 POST/GET 数据将此值设置为他们想要的任何值。

关于c# - ASP.NET MVC 3 - 在 View 中处理模型的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598163/

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