MVC表单字段验证问题

时间:2016-09-24 11:33:59

标签: c# asp.net-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; }

问题是当你将光标放入灰色的字段,然后进入另一个字段时,验证会错误地触发。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

客户端验证错误的原因是您已为该属性生成了一个文本框,默认情况下,jquery.validate.js根据MM/dd/yyyy格式验证日期,而您的格式为{{1} }。您可以按照subsequent question的答案中的说明覆盖dd/MM/yyyy

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

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

$.validator

显示日期,如有必要,您可以将div格式化为其他文本框。您还应删除关联的<div>@Html.DisplayFor(m => m.CREATED)</div> ValidationMessageFor()(您不再拥有关联的表单控件,因此LabelFor()元素不合适 - 您可以使用(比方说)<label>

如果您想提交<span>@Html.DisplayNameFor(m => m.CREATED)</span>的值,那么您还可以为该值包含隐藏的输入(默认情况下,隐藏的输入未经过验证)

CREATED

但是,因为您编辑数据,所以应该使用view model,而不是数据模型。在POST方法中,您可以根据其ID从存储库中获取原始数据模型,并根据视图模型中的值更新其属性(因为您不需要更新该值,因此需要将隐藏的输入作为冗余) 。此模式还可以保护您免受可能更改请求并发回更改日期值的恶意用户的攻击。<​​/ p>