ASP.NET MVC可选字段被视为必需

时间:2012-11-08 16:25:13

标签: asp.net-mvc asp.net-mvc-3

我有这个字段,出于某种原因,当我点击提交时,会收到验证消息,说明该字段是必需的。

[DisplayName("Total Budget:")]
public double Budget { get; set; }

@Html.EditorFor(model => model.account.Budget)
@Html.ValidationMessageFor(model => model.account.Budget)

public class Account
{
    [DisplayName("Total Budget:")]
    public double Budget { get; set; } //dropdown
}

6 个答案:

答案 0 :(得分:94)

MVC中的内置DefaultModelBinder将对值类型(如int,DateTime,decimal等)执行必需和数据类型验证。即使您没有使用类似[Required]之类的内容明确指定验证,也会发生这种情况。

为了使其成为可选项,您必须将其定义为可为空:

public double? Budget { get; set; }

答案 1 :(得分:7)

double是一种值类型。值类型始终包含值,即使您未设置值也是如此。该值是其类型的默认值(在本例中为0.0)。根据框架的要求处理所有值类型。解决这个问题的唯一方法是创建一个自定义模型绑定器,但这不会阻止模型包含默认值(因为没有办法说它没有输入)。

因此,即使您创建自定义活页夹,当您处理模型时,您也无法判断是否有人输入了0或者这是否只是默认值。

因此,唯一真正的解决方案是将视图模型更改为使用可空类型,例如Nullable<double>(简写为double?)。

答案 2 :(得分:2)

您可能会将预算从double更改为double?

您可以尝试将此属性添加到控制器

BindExclude([Bind(Exclude="Budget")])以及

答案 3 :(得分:2)

您必须在application_start(global.asax)

中添加以下行
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

来源:Unrequired property keeps getting data-val-required attribute

答案 4 :(得分:0)

使用[NotMapped]注释,这将删除流程中所需的验证,您还使用自己的显示属性

答案 5 :(得分:0)

在属性名称后使用 Nullable