【问题标题】:How can I prevent a validation attribute from being generated?如何防止生成验证属性?
【发布时间】:2011-11-18 13:57:44
【问题描述】:

我的模型中有一个DateTime 属性,但我只对时间部分感兴趣:

public class MyModel
{
    [Required, DataType.Time]
    public DateTime Time
}

在我看来,我是这样输出的:

@Html.EditorFor(model => model.Time)

这用于在 MVC 3 中生成以下 html:

<input class="text-box single-line" data-val="true" 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" />

现在我正在尝试使用 MVC 4,这是生成的 html:

<input class="text-box single-line" data-val="true" 
    data-val-date="The field Time must be a date." 
    data-val-required="The Time field is required." 
    id="Time" name="Time" type="time" value="" />

添加了一个额外的属性data-val-date,这会导致客户端验证错误,因为时间(例如“10:30”)未格式化为日期。

我想这是 MVC 4 (I reported it) 中的一个错误?但是在解决之前,有没有办法阻止这个属性的生成呢?或者更好的是,有没有办法让它生成为data-val-time,这样我就可以为时间字段提供我自己的客户端验证方法?

【问题讨论】:

    标签: c# .net asp.net-mvc jquery-validate asp.net-mvc-4


    【解决方案1】:

    不理想,但可以完成工作;在您的主模板中使用 JavaScript 来删除验证:

    $(document).ready(function(){
        $("input[data-val-date]").removeAttr("data-val-date");
    });
    

    【讨论】:

      【解决方案2】:

      使用[DataType("Time")] 代替[DataType(DataType.DateTime)]。这将使 MVC 不会将您的变量视为DateTime,然后它不会生成data-val-date 属性。

      基本上[DataType("Time")] 使您的变量成为自定义类型。但是,您不能为自定义类型使用任何其他字符串名称。 MVC 尝试检测自定义类型的底层类型。只有当您将自定义类型命名为Time 时,它才会放弃检测。

      【讨论】:

        【解决方案3】:

        我可以说更好的选择是编写自己的客户端验证函数。否则你可以做一些欺骗,我不会说这是正确的方法,但它可以解决你的问题。关于 MVC 验证,我有类似的问题,我想更改客户端验证的行为。请看链接

        Asp.net MVC3 validation

        这里的想法是您手动将“data-val-required”和“data-val”等属性添加到输入字段,然后为其添加验证消息。

        希望它对您有所帮助。

        编辑:

        试试这个

        从模型中删除必填字段 attr

        public class MyModel
        {    
            public DateTime Time
        }
        

        然后将属性添加到您的控件中,如下所示

            @Html.TextBoxFor(model => model.Time, new Dictionary<string, object> { { "data-val-required", "required" }, { "data-val", "true" }})
            @Html.ValidationMessage("Time", "The Time field is required.")
        

        【讨论】:

        • 感谢您的回答,但这并不能真正解决我的问题...我希望插入一个特定属性 (data-val-date) 以 插入,因为它得到自动插入 MVC 管道中的某处。
        【解决方案4】:

        我尝试将输入字段的值设置为 javascript 日期对象,这反过来又通过了不显眼的验证。

        $("#date-input-field").val(new Date(1,0,1970));
        $.validator.unobtrusive.parse('#form');
        var form = $('#form');
        form.validate();
        

        这是通过 jQuery 1.7.2、validation.unobtrusive 和 mvc4 完成的。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          最好的方法是在HtmlHelper 类中将ClientValidationEnabledUnobtrusiveJavaScriptEnabled 设置为false。

          HtmlHelper.ClientValidationEnabled = false;
          HtmlHelper.UnobtrusiveJavaScriptEnabled = false;
          

          【讨论】:

          • 我的配置中有这些。将它们关闭也确实有效。
          • 但我更喜欢只在视图中设置。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 2011-10-11
          • 1970-01-01
          相关资源
          最近更新 更多