2016-09-24 118 views
0

在我的编辑VIEW我有以下代码:MVC的表单字段验证问题

<div class="form-group"> 
    @Html.LabelFor(model => model.CREATED, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.CREATED, new { htmlAttributes = new { @class = "form-control", @readonly = true } }) 
     @Html.ValidationMessageFor(model => model.CREATED, "", new { @class = "text-danger"}) 
    </div> 
</div> 

正如你可以看到Created文本框是只读的,是灰色的。

Validation fires wrongly

在我模型我有以下几点:

public Nullable<System.DateTime> CREATED { get; set; } 

问题是,当你把光标移动到灰色的领域,然后再进入另一个领域,验证火灾错。

我该如何解决这个问题?

+0

如果它不能被编辑,那你为什么要为它创建一个表单控件?并且发生错误是因为'jquery.validate.js'验证了基于'MM/dd/yyyy'格式的日期,并且您的文化看起来像是'dd/MM/yyyy' –

+0

由于属性的名称表示日期记录创建它不应该在视图中 - 它应该只在控制器中立即保存数据模型之前设置(并且您的视图应该使用[视图模型](http://stackoverflow.com/questions/) 11064316/what-is-viewmodel-in-mvc)没有'CREATED'属性 –

+0

我想在创建时显示,如果在'div'中创建这个值,我会面临这个问题吗? – PriceCheaperton

回答

1

客户端验证错误的原因是您已经为该属性生成了一个文本框,默认情况下,jquery.validate.js验证基于MM/dd/yyyy格式的日期,而您的格式为dd/MM/yyyy。您可以覆盖$.validator,如subsequent question的答案中所述。

但是,真正的问题是,您不应该为“创建日期”(或“修改日期”)属性生成表单控件。这些值只能在保存对象之前立即在控制器的POST方法中设置。

在视图中,如果您编辑现有的对象,请使用

<div>@Html.DisplayFor(m => m.CREATED)</div> 

显示日期,你可以格式化DIV如有必要,看起来像你的其他文本框。你也应该删除相关ValidationMessageFor()LabelFor()(你不再有关联的表单控件所以<label>元素是不恰当的 - 你可以使用(比方说)<span>@Html.DisplayNameFor(m => m.CREATED)</span>

如果你想提交的CREATED的值,然后您还可以包括值一个隐藏的输入(默认情况下,隐藏的输入没有经过验证)

@Html.HiddenFor(m => m.CREATED) // you can use a [DisplayAttribute] for formatting the value 

但是,因为你在编辑数据,你应该使用view model,不是你的数据模型。在POST方法中,您根据存储库的ID从存储库中获取原始数据模型,并根据来自视图模型的值更新其属性(由于您不需要更新该值,所以需要隐藏输入冗余) 。此模式还可以防止恶意用户更改请求并发送更改后的日期值。