我的一个模型包含一个看起来像这样的属性
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)
我没有EditorTemplate
为DateTime类型创建一个。最后,在同一视图的脚本中,我附加jQuery Datepicker
var $dpMyDate = $('[name=MyDate]');
$dpMyDate.datepicker();
我基本上想呈现一个只读datepicker
(下一步将是实现更多脚本,如果满足某些条件,它将启用它)。
一切似乎都正常,但是单击“保存”按钮时,验证告诉我该字段是必填字段,但我希望不是必须的,因为我没有将[Required]
属性放在类中。另外(但这可能只是我的假设太多),感觉很奇怪,需要一个只读输入字段(应该如何填充它?)
我没有发现代码有什么问题,我缺少什么吗?
通过阅读注释,您似乎无法通过ASP.NET MVC添加的javascript验证。问题是,尽管您的私有字段可为空,但该属性为不可为空(DateTime
是一个结构)。ASP.NET MVC绑定到该属性,并得出结论,即使未将其标记为,它也是“必需的” [Required]
。
结果,ASP.NET MVC将生成javascript,就好像它被标记为[Required]
属性一样。特别是,您使用EditorFor()
,因此javascript ASP.NET MVC注入将根据需要对其进行处理。由于这是一个只读表单元素,因此我相信javascript会抱怨。
解决此问题的方法是使用DisplayFor()
不附带该javascript的。
请注意,如果您有一个可为空的属性,[Required]
但又不希望它可编辑,那么除了使用-实际上,您还需要做一些额外的事情-您需要在ASP的HTTP请求中DisplayFor()
提交一些内容。 NET MVC知道如何对绑定进行建模。最受欢迎的选项是带有的<input>
元素type=hidden
。因为用户对他发送到服务器的HTTP请求具有绝对的控制权,所以您可能希望忽略提交的值以防止“过度发布”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句