Asp.net mvc 4 MVC字段不是必需的,但用户被告知是必需的

Asp.net mvc 4 MVC字段不是必需的,但用户被告知是必需的,asp.net-mvc-4,Asp.net Mvc 4,标题说明了一切。该模型不需要StartDate字段,但在帖子中我被告知这是必需的。它是几个搜索字段中的一个,每个字段都是可选的。因此,我没有检查IsModel.Valid,所以搜索仍然有效,但消息会显示在屏幕上。如果在视图中设置@Html.ValidationSummary(true),则会隐藏消息,但字段仍然变为红色 此外,我还要检查EndDate是否晚于StartDate,因此我需要显示errors/Required字段的消息,而不是在没有错误时 代码如下: 模型(部分) 视图(部分) @使

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

此外,我还要检查EndDate是否晚于StartDate,因此我需要显示errors/Required字段的消息,而不是在没有错误时

代码如下:

模型(部分)

视图(部分)

@使用(Html.BeginForm()){
@Html.ValidationSummary(false)
@DisplayNameFor(m=>m.StartDate)
@TextBox(“StartDate”,new{@class=“datefield”})
等
共享/显示模板

@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"  })
} 
@模型可为空
@(Model!=null?string.Format(“{0:M/d/yyyy}”,Model):string.Empty)
共享/编辑器模板

@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"  })
} 
@模型可为空
@{
DateTime dt=DateTime.Now;
如果(型号!=null)
{
dt=(System.DateTime)模型;
}
@Html.TextBox(“,String.Format(“{0:M/d/yyyy}”,dt.ToShortDateString()),new{@class=“datefield”,type=“date”})
} 
顺便说一句,这些编辑器中的一些将使弹出式日历正常工作


我尝试过打开/关闭各种功能,但不管怎样,它仍然表示日期字段是必需的。有什么想法吗?谢谢。

如注释中所述,如果不将日期时间、int、decimal等值类型设置为空,则它们将被视为必需的


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

删除验证的简单方法是将int null设为可选项,我已经测试过了,效果很好。以下是示例:

 public int? Id { get; set; }

您是否尝试将其设置为可空?如果不是,是否存在另一个具有元数据属性的分部?谢谢。将其设置为可空部分解决了这一问题。我可以提交两个空值,但不仅仅是StartDate和null EndDate,因为EndDate必须更晚。此处确实有两个验证。您无法在标准a中执行类似的逻辑属性。您必须编写自定义验证来处理条件情况。您也可以使用IValidatableObject或类似FluentValidation的内容。不确定,但请尝试删除[DataType(DataType.Date)]。这可能是强制将其设置为必需的,而不是null,并且类型为dateTime。当在comlplex ViewModel中使用时,如果使用get;set;properties,则int等值可以正常工作,而不必为null,因为初始值设定项将其设置为默认值0。它来自MVC万无一失的验证。事实证明,这不是万无一失的。我只是在邮件上写了一个简单的检查。