MVC表单字段不是必需的,但提示用户是必需的。

3

标题说的很明白。该模型不需要StartDate字段,但在提交时我被告知它是必需的。它是多个搜索字段之一,每个字段都是可选的。由于这个原因,我没有检查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"  })
} 

顺便说一下,其中一些编辑器是为了使弹出式日历工作的。

我已经尝试开启/关闭各种选项,但无论如何,它仍然显示日期字段是必填项。有什么想法吗?谢谢。


6
你尝试将它设为可空的了吗? - Mike Cheel
如果不是这样,是否存在另一个具有元数据属性的部分? - CodeCaster
到目前为止,感谢您的帮助。将其设置为可空部分解决了这个问题。我可以提交两个空值,但不能只有开始日期和空结束日期,因为结束日期必须晚于开始日期。 - Geminirand
不确定,但尝试移除[DataType(DataType.Date)]。可能是因为它强制要求它是必需的、非空的和dateTime类型的。 - Robert Hoffmann
我编写了一个属性来处理“一个必须晚于另一个”的情况。 - Mike Cheel
显示剩余2条评论
2个回答

7

取消验证的简单方法是使int可为空,我已经测试过了,它可以正常工作。以下是示例:

 public int? Id { get; set; }

5

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

如果GreaterThanOrEqualTo属性不是来自库(如MVC Foolproof Validation),您应该允许它在Startdate和Enddate都为null时返回true。否则,您将需要编写自己的自定义验证属性,但这并不难做到。


当在复杂的ViewModel中使用时,像int这样的值只要使用get;set;属性就可以正常工作,因为初始化程序将其设置为默认值0,无需使用可空类型。 - Robert Hoffmann
这是来自MVC Foolproof验证的内容。事实证明并不是那么“foolproof”。我刚刚在POST上写了一个简单的检查。 - Geminirand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接