EF4 MVC3模型状态验证

时间:2012-07-18 13:43:24

标签: asp.net-mvc-3 entity-framework-4.1

使用此模型:

public class Cases
    {
    //case data model for call center
    //implement lists for all related child tables too

    [Key]
    public int CasesID { get; set; }

    public string CaseNumber { get; set; }

    [Required(ErrorMessage = "Customer is Required")]
    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }

    [MaxLength(50)]
    public string UserName { get; set; }  //get user name from the aspnet membership

    [Required(ErrorMessage = "Case Category is Required")]
    public int CaseCategoryID { get; set; }

    [Required(ErrorMessage = "Technician is Required")]
    public int TechnicianID { get; set; }
    public virtual Technician Technicians { get; set; }

    [Required(ErrorMessage = "Engine Model is Required")]
    public int EngineModelID { get; set; }
    public virtual EngineModel EngineModel { get; set; }

    [MaxLength(50)]
    public string BMSWorkorder { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Status is Required")]
    public string CaseStatus { get; set; }

    [MaxLength(50)]
    public string OpenedBy { get; set; }

    [Required(ErrorMessage = "Opened Date is Required")]
    [DataType(DataType.DateTime)]
    public DateTime? OpenedDate { get; set; }

    [MaxLength(50)]
    public string ClosedBy { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? ClosedDate { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage="Caller First Name is Required")]
    public string CallerFirstName { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Caller Last Name is Required")]
    public string CallerLastName { get; set; }

    [MaxLength(100)]
    public string AdditionalContact { get; set; }

    [MaxLength(10)]
    [Required(ErrorMessage = "Qualified is Required")]
    public string Qualified { get; set; }

    public string Description { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "ESN is Required")]
    public string ESN { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Mileage is Required")]
    public string Mileage { get; set; }

    [DataType(DataType.Date)]
    public DateTime? DateInService { get; set; }

    [MaxLength(50)]
    public string ESTR { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "EDS is Required")]
    public string EDS { get; set; }

    [MaxLength(50)]
    public string GensetSerialNumber { get; set; }

    [MaxLength(50)]
    public string GensetModelNumber { get; set; }

    //child Case Notes records
    public virtual ICollection<CaseNotes> CaseNotes { get; set; }

    //child case attachment records
    public virtual ICollection<Attachment> Attachments { get; set; }

    //child case complaint records
    public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

    //tracking fields
    public DateTime? CreatedOn { get; set; }
    [MaxLength(50)]
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    [MaxLength(50)]
    public string ModifiedBy { get; set; }
    }

我想知道为什么即使只需要标记一些属性,模型状态也不会设置为有效,除非保存时所有属性都有值。

我做错了吗?

修改

以下是我所讨论的下拉列表字段的剃刀元素:

@Html.DropDownList("Qualified", String.Empty)
@Html.ValidationMessageFor(model => model.Qualified)

@Html.DropDownList("EngineModelID", String.Empty)
@Html.ValidationMessageFor(model => model.EngineModelID)

@Html.DropDownList("CaseCategoryID", String.Empty)
@Html.ValidationMessageFor(model => model.CaseCategoryID)

1 个答案:

答案 0 :(得分:2)

如果要允许空值,则EngineModelIDCaseCategoryID属性必须是视图模型上可为空的整数。 Oooops,你没有使用视图模型。

ASP.NET MVC自动生成所需的非可空类型。您可以在Application_Start

中明确禁用此功能
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

但是如果你想要正确地做这些事情,你应该使用视图模型。

以下是绝对可怕的:

@Html.DropDownList("CaseCategoryID", String.Empty)

我猜你在SelectList中填了ViewBag.CaseCategoryID,所以CaseCategoryID同时做两件事:它代表一个列表和一个选定的标量值。

使用视图模型,您可以使用这些帮助程序的强类型版本:

@Html.DropDownListFor(x => x.CaseCategoryID, Model.CaseCategories)

其中CaseCategories将是您的视图模型上的IEnumerable<SelectListItem>属性,控制器将填充该属性。