MVC字段不是必需的,但用户被告知它们是

Gem*_*and 2 asp.net-mvc-4

标题说明了一切.该模型不需要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; }
Run Code Online (Sandbox Code Playgroud)

查看(部分)

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

etc.
Run Code Online (Sandbox Code Playgroud)

共享/显示模板

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

共享/编辑模板

@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"  })
} 
Run Code Online (Sandbox Code Playgroud)

这些编辑中的一些是制作弹出式日历工作,顺便说一句.

我试过打开/关闭各种各样的东西,但仍然说日期字段是必需的.有任何想法吗?谢谢.

Han*_*nno 5

如注释中所述,如果不使它们可为空,则将DateTime,int,decimal等值类型视为必需.

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


Avt*_*ili 5

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

 public int? Id { get; set; }
Run Code Online (Sandbox Code Playgroud)