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

use*_*812 39 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
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*ose 98

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

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

public double? Budget { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,谢谢你,谢谢你 (2认同)

Eri*_*sch 7

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

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

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

  • 如果你有一个你想拥有默认属性的属性,如果没有指定它,那就太烦人了.我希望我的属性为0,而不是null,如果它留空,但MVC自动验证失败,说它是必需的. (3认同)

小智 6

您必须在application_start(global.asax)中添加以下行

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Run Code Online (Sandbox Code Playgroud)

来源:不需要的属性不断获取data-val-required属性

  • 请注意:1) 这是全局的,将影响所有值类型(包括日期和枚举),2) 已从 Aspnet Core 中删除 (2认同)