1

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

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]属性放入类中。此外(但这可能只是我假设太多)需要一个只读输入字段感觉很奇怪(应该如何填充它?)

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

4

3 回答 3

1

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

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

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

请注意,如果您有一个可为的属性,[Required]但您不希望它是可编辑的,那么您实际上需要做一些额外的事情,除了使用DisplayFor()-- 您需要在 ASP 的 HTTP 请求中提交一些东西。 NET MVC 知道如何建模绑定。最受欢迎的选项是<input>带有type=hidden. 因为用户对他发送到服务器的 HTTP 请求具有绝对控制权,所以您可能希望忽略提交的值以防止“过度发布”。

于 2013-09-13T09:20:12.523 回答
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)它是没有必要的。

于 2013-09-13T09:45:23.200 回答
0

我认为这是因为您的日期不可为空。尝试像这样定义它

public DateTime? MyDate
于 2013-09-13T08:21:11.000 回答