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

ASP.NET MVC 3:以编程方式向视图模型添加DataAnnotation(RequiredAttribute),asp.net,asp.net-mvc,asp.net-mvc-3,validation,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Validation,我正在使用javascript进行不引人注目的验证。我有一个视图模型,我正在为几个表单重复使用它,在一些表单中,视图模型上的一些属性是必需的。在其他形式上,它们不应该是。有没有一种方法可以通过编程在属性上设置[Required],这样我就可以完成这个任务 谢谢 我不知道如何使用数据注释来实现这一点。但是,在您的视图中,您可以在javascript中添加/删除所需的规则 $("#myProperty").rules("add", { required: true }); 或 无法使用DataAn

我正在使用javascript进行不引人注目的验证。我有一个视图模型,我正在为几个表单重复使用它,在一些表单中,视图模型上的一些属性是必需的。在其他形式上,它们不应该是。有没有一种方法可以通过编程在属性上设置[Required],这样我就可以完成这个任务


谢谢

我不知道如何使用数据注释来实现这一点。但是,在您的视图中,您可以在javascript中添加/删除所需的规则

$("#myProperty").rules("add", { required: true });


无法使用DataAnnotation完成,因为它们是在编译时实现的,并且不能动态添加。你也可以

创建具有适当注释的不同视图模型

拥有一个将视图模型发送到的服务,该服务根据模型来自的操作检查模型,并返回一个可以附加到模型状态的验证错误列表

在ViewModel上放置一个属性,例如
string IsBeingUsedFor
,并将其与RequiredIf DataAnnotation结合使用。然后你可以说,[RequireIf(“IsBeingUsedFor”,“Action_A”)]


这些不一定是所有的选择,但一些更干净的选择。您可以在JavaScript中完成这一切,但如果“坏人”提交表单并绕过客户端验证,您将失去服务器端验证,并可能在应用程序中打开一些漏洞。

在运行时通过反射进行访问,因此我不知道您可以在需要时关闭或打开。我的建议是创建“必需”视图模型和“不必需”视图模型。我知道这可能是您想要的,但这将是我能想到的最简单的方法。

如果客户端验证对您来说足够了,那么您可以在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>
@Html.LabelFor(model=>model.title,新的{@class=“control label col-md-2”})
@如果(Model.IsTitleRequired==true)
{
@TextBoxFor(model=>model.title,新的{@required=true})
}
其他的
{
@Html.TextBoxFor(model=>model.title)
}
@Html.ValidationMessageFor(model=>model.title)

很高兴知道,谢谢!我可能会使用RequiredIf,但请记住这一点。非常好的信息!再看看我需要什么,我想我可以创建一个从我的基本视图模型继承的视图模型,并且不受影响。如果没有,我就试试看。
    @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>