2

标题说明了一切。该模型不需要 StartDate 字段,但在 POST 上我被告知它是必需的。它是多个搜索字段之一,每个字段都是可选的。因此,我没有检查 IsModel.Valid 所以搜索仍然有效,但消息显示在屏幕上。如果我在视图中设置@Html.ValidationSummary(true),它会隐藏消息,但该字段仍会变为红色。

此外,我确实进行了检查以确保 EndDate 晚于 StartDate,因此我需要显示错误/所需字段的消息,而不是在没有错误时显示。

这是代码:

型号(部分)

[Display(Name = "Start Date")]
[DataType(DataType.Date)]
public DateTime StartDate { get; set; }

[Display(Name = "End Date")]
    [GreaterThanOrEqualTo("StartDate", ErrorMessage = "End Date must be later than Start Date")]
    [DataType(DataType.Date)]
    public DateTime EndDate { get; set; }

查看(部分)

@using (Html.BeginForm()){ 
@Html.ValidationSummary(false)
<table>
<tr>
    <td>
        @Html.DisplayNameFor(m => m.StartDate)
        @Html.TextBox("StartDate", "", new { @class = "datefield" })

etc.

共享/显示模板

@model Nullable<DateTime>
@(Model != null ? string.Format("{0:M/d/yyyy}", Model) : string.Empty)

共享/编辑器模板

@model Nullable<DateTime>
 @{
DateTime dt = DateTime.Now;
if (Model != null)
{
   dt  = (System.DateTime) Model;

}
@Html.TextBox("", String.Format("{0:M/d/yyyy}", dt.ToShortDateString()), new { @class = "datefield", type = "date"  })
} 

顺便说一句,其中一些编辑器将制作弹出式日历。

我试过以一种或另一种方式打开/关闭各种东西,它仍然说需要日期字段。有任何想法吗?谢谢。

4

2 回答 2

5

如评论中所述,如果您不将它们设为可空,则 DateTime、int、decimal 等值类型将被视为必需。

如果 GreaterThanOrEqualTo 属性不是来自库(例如 MVC Foolproof Validation),那么如果 Startdate 和 Enddate 都为 null,则应该让它返回 true。否则,您必须编写自己的自定义验证属性,但这并不难。

于 2013-07-02T17:42:26.393 回答
5

删除验证的简单方法是使 int Null-able,我已经测试过并且它工作正常。这是示例:

 public int? Id { get; set; }
于 2017-01-25T08:27:44.793 回答