【问题标题】:ASP.NET MVC 3: programmatically add DataAnnotation (RequiredAttribute) to view modelASP.NET MVC 3:以编程方式将 DataAnnotation (RequiredAttribute) 添加到视图模型
【发布时间】:2012-04-20 21:08:43
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果客户端验证对您来说足够了,那么您可以在 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>
    

    【讨论】:

      【解决方案2】:

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

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

      或

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

      或

      在 ViewModel 上放置一个属性,例如string IsBeingUsedFor,并将其与RequiredIf DataAnnotation 结合使用。 Here is an example of a library already build that uses conditional DataAnnotations。那么你可以说,[RequireIf("IsBeingUsedFor", "Action_A")]

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

      【讨论】:

      • 好消息!从另一个角度看我需要什么,我认为我可以制作一个从我的基本视图模型继承的视图模型并摆脱它。如果没有,我会尝试RequiredIf。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        或

        $("#myProperty").rules("remove", "required");
        

        【讨论】:

        • 很高兴知道,谢谢!我可能会使用RequiredIf,但请记住这一点。
        猜你喜欢
        • 1970-01-01
        • 2017-10-09
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多