使用此模型:
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)
答案 0 :(得分:2)
如果要允许空值,则EngineModelID
和CaseCategoryID
属性必须是视图模型上可为空的整数。 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>
属性,控制器将填充该属性。