【发布时间】:2012-04-20 21:08:43
【问题描述】:
我正在使用 javascript 不显眼的验证。我有一个视图模型,我正在为多个表单重复使用,并且在某些表单中,视图模型上的一些属性是必需的。在其他形式上,它们不应该是。有没有办法以编程方式在属性上设置 [Required],以便我可以完成此操作?
谢谢!
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 validation
我正在使用 javascript 不显眼的验证。我有一个视图模型,我正在为多个表单重复使用,并且在某些表单中,视图模型上的一些属性是必需的。在其他形式上,它们不应该是。有没有办法以编程方式在属性上设置 [Required],以便我可以完成此操作?
谢谢!
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 validation
如果客户端验证对您来说足够了,那么您可以在 Razor 视图中执行以下操作,例如:
@Html.LabelFor(model => model.title, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@if (Model.IsTitleRequired == true)
{
@Html.TextBoxFor(model => model.title, new { @required = true })
}
else
{
@Html.TextBoxFor(model => model.title)
}
@Html.ValidationMessageFor(model => model.title)
</div>
【讨论】:
不能使用 DataAnnotations 来完成,因为这些是在编译时实现的,不能动态添加。你可以
创建具有适当注释的不同视图模型
或
有一个服务,您将视图模型发送到该服务,该服务根据模型来自的操作检查模型,并返回您可以附加到模型状态的验证错误列表
或
在 ViewModel 上放置一个属性,例如string IsBeingUsedFor,并将其与RequiredIf DataAnnotation 结合使用。 Here is an example of a library already build that uses conditional DataAnnotations。那么你可以说,[RequireIf("IsBeingUsedFor", "Action_A")]
这些不一定是所有选项,而是一些更简洁的选项。您可以在 JavaScript 中完成所有这些操作,但是如果“坏人”提交表单并绕过客户端验证,您将失去服务器端验证,并且可能会在您的应用程序中打开一些漏洞。
【讨论】:
Attributes 在运行时通过反射访问,所以我不知道您可以在需要时关闭和打开。我的建议是创建一个“必需”视图模型和一个“非必需”视图模型。我知道你这可能是你想要的,但这是我能想到的最简单的方法。
【讨论】:
我不知道有什么方法可以使用数据注释来做到这一点。但是,在您看来,您可以在 javascript 中添加/删除所需的规则。
$("#myProperty").rules("add", { required: true });
或
$("#myProperty").rules("remove", "required");
【讨论】: