ASP.NET MVC 3:以编程方式将DataAnnotation(RequiredAttribute)添加到视图模型中

时间:2012-04-07 18:35:03

标签: asp.net asp.net-mvc asp.net-mvc-3 validation

我正在使用javascript不显眼的验证。我有一个视图模型,我正在重复使用几种形式,在某些形式中,视图模型上的一些属性是必需的。在其他形式上,他们不应该。有没有办法以编程方式在属性上设置[必需],以便我可以完成此操作?

谢谢!

4 个答案:

答案 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>