我的一个模型包含一个看起来像这样的属性
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]
属性。另外(但这可能只是我假设太多)感觉很奇怪,只需要一个只读输入字段(如何填充它?)
我没有看到代码有什么问题,我错过了什么?
答案 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