已禁用的DateTime字段在MVC4页面中标记为必需

时间:2013-09-13 08:05:24

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

我的一个模型包含一个看起来像这样的属性

private Nullable<DateTime> myDate;

[Display(Name = "My Date")]
[Editable(false)]
// [DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}", ApplyFormatInEditMode = true)]
public DateTime MyDate
{
    get { return this.myDate?? new DateTime(1, 1, 1); }
    set { this.myDate = value; }
}

// [DataType(DataType.Date)]被注释掉了,因为它是我做过的一些实验的遗留物。

在我的“编辑”视图中,我像这样呈现属性

// input.noborder { border: 0 none; }
@Html.EditorFor(model => model.MyDate, new { @readonly = true, @class = "noborder" })
@Html.ValidationMessageFor(model => model.InvoiceDate)

我没有为DateTime类型创建EditorTemplate。最后,在同一视图的脚本中,我附上了jQuery Datepicker

var $dpMyDate = $('[name=MyDate]');
$dpMyDate.datepicker();

我基本上想要呈现一个只读的datepicker(下一步是实现更多的脚本,如果满足某些条件就会启用它。)

一切似乎都有效,但点击“保存”按钮后,验证会告诉我该字段是必需的,但我预计不会这样,因为我没有在类中放置[Required]属性。另外(但这可能只是我假设太多)感觉很奇怪,只需要一个只读输入字段(如何填充它?)

我没有看到代码有什么问题,我错过了什么?

3 个答案:

答案 0 :(得分:1)

从阅读评论看起来,您在ASP.NET MVC添加的javascript验证中失败了。问题是,虽然您的私有字段可以为空,但该属性是不可为空的(DateTime是一个结构)。 ASP.NET MVC绑定到该属性并得出结论,即使它未标记为[Required],它仍为“必需”。

因此,ASP.NET MVC将生成javascript,就好像它被标记为[Required]属性一样。特别是,您使用了EditorFor(),因此JavaScript MVC注入将根据需要对其进行处理。因为它是一个只读形式元素我相信 javascript会抱怨。

解决这个问题的方法是使用没有附加javascript的DisplayFor()

请注意,如果您的可以为空的属性为[Required]但您不希望它是可编辑的,那么除了使用{之外,您实际上还需要做一些额外的事情{1}} - 您需要在ASP.NET MVC知道如何建模绑定的HTTP请求中提交某些。最受欢迎的选项是带有DisplayFor()的{​​{1}}元素。由于用户可以绝对控制他发送给服务器的HTTP请求,因此您可能希望忽略提交的值以防止“重叠”。

答案 1 :(得分:1)

试试这个,

更改此

@Html.EditorFor(model => model.MyDate, new { @readonly = true, @class = "noborder" })

@Html.TextBoxFor(model => model.MyDate, new { @readonly = true, @class = "noborder" })

删除@Html.ValidationMessageFor(model => model.InvoiceDate)不需要。

答案 2 :(得分:0)

我认为这是因为你的约会不是Nullable。 尝试将其定义为

public DateTime? MyDate