2

我正在使用 javascript 不显眼的验证。我有一个视图模型,我正在为多个表单重复使用,并且在某些表单中,视图模型上的一些属性是必需的。在其他形式上,它们不应该是。有没有办法以编程方式在属性上设置 [Required],这样我就可以做到这一点?

谢谢!

4

4 回答 4

8

不能使用 DataAnnotations 来完成,因为这些是在编译时实现的,不能动态添加。你可以

创建具有正确注释的不同视图模型

或者

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

或者

在 ViewModel 上放置一个属性,例如string IsBeingUsedFor并将其与RequiredIf DataAnnotation 结合使用。 这是一个已经构建的使用条件 DataAnnotations 的库的示例。然后你可以说,[RequireIf("IsBeingUsedFor", "Action_A")]

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

于 2012-04-07T18:45:27.903 回答
3

我不知道有任何方法可以使用数据注释来做到这一点。但是,在您看来,您可以在 javascript 中添加/删除所需的规则。

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

或者

$("#myProperty").rules("remove", "required");
于 2012-04-07T18:45:08.210 回答
2

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

于 2012-04-07T18:45:29.920 回答
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>
于 2017-08-01T17:21:21.230 回答