如何防止生成验证属性

本文关键字:验证 属性 何防止 | 更新日期: 2023-09-27 18:15:01

我在我的模型中有一个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(我报告了它)?但是,在解决这个问题之前,有什么方法可以防止这个属性被生成吗?或者更好的是,是否有一种方法可以让它作为data-val-time生成,这样我就可以为时间字段提供我自己的客户端验证方法?

如何防止生成验证属性

不理想,但它会做的工作;在主模板中使用JavaScript删除验证:

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

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

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

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

Asp.net mvc验证

这里的想法是您手动添加属性,如"data- value -required"answers"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.")

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

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

这是通过jQuery 1.7.2,验证完成的。不引人注目和mvc4.

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

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