我正在使用javascript不显眼的验证。我有一个视图模型,我正在重复使用几种形式,在某些形式中,视图模型上的一些属性是必需的。在其他形式上,他们不应该。有没有办法以编程方式在属性上设置[必需],以便我可以完成此操作?
谢谢!
答案 0 :(得分:8)
无法使用DataAnnotations完成,因为这些是在编译时实现的,无法动态添加。你可以
创建具有正确注释的不同视图模型
或
让您发送视图模型的服务根据其来自的操作检查模型,并返回可以附加到模型状态的验证错误列表
或
在ViewModel上放置一个属性,例如string IsBeingUsedFor
,并将其与RequiredIf DataAnnotation结合使用。 Here is an example of a library already build that uses conditional DataAnnotations。然后你可以说,[RequireIf(“IsBeingUsedFor”,“Action_A”)]
这些不一定是所有选项,而是一些更清洁的选项。您可以在JavaScript中完成所有操作,但如果“坏人”提交表单并绕过客户端验证,您将丢失服务器端验证并在应用程序中打开一些漏洞。
答案 1 :(得分:3)
我不知道用数据注释做任何事情。但是,在您的视图中,您可以在javascript中添加/删除所需的规则。
$("#myProperty").rules("add", { required: true });
或
$("#myProperty").rules("remove", "required");
答案 2 :(得分:2)
Attributes在运行时通过反射访问,所以我不知道你可以在你想要的时候关闭和打开。我的建议是创建一个“必需”ViewModel和一个“NotRequired”视图模型。我知道你这可能是你想要的,但这是我能想到的最简单的方法。
答案 3 :(得分:0)
如果客户端验证对您来说足够,那么您可以在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>