DropDownList验证 - ModelState.IsValid始终为false

问题描述:

我尝试创建一个asp.net mvc 2应用程序。 我的DropDownList将不会被验证!DropDownList验证 - ModelState.IsValid始终为false

我有一个核心模型类称为动物与一些属性和相同的类类。这些类映射到nHibernate。


namespace Core.Models 
{ 
    public class Animal 
    { 
     public Animal() { } 

     public virtual int AnimalId { get; set; } 

     [DisplayName("Name")] 
     [Required(AllowEmptyStrings = false, ErrorMessage = "Name is required")] 
     public virtual string Name { get; set; } 

     [DisplayName("Gattung")] 
     [Required(ErrorMessage = "Genus is required")] 
     public virtual Genus Genus { get; set; } 
    } 
} 
namespace Core.Models 
{ 
    public class Genus 
    { 
     public Genus() { } 

     public virtual int GenusId { get; set; } 

     [DisplayName("Name")] 
     public virtual string GenusTitle { get; set; } 
    } 
} 
 

在我的UI项目我有叫AnimalViewModel

 

    public class AnimalViewModel 
    { 
     public Animal Animal { get; set; } 
     public string ReturnUrl { get; set; } 

     public IList Genus { get; set; } 

     public AnimalViewModel(Animal a, string returnUrl) 
     { 
      this.Animal = a; 
      this.ReturnUrl = returnUrl;    
     } 

     public AnimalViewModel() { } 
    } 
 

一个ViewModel类下面是我的看法:

 

model.Animal.Genus, new SelectList(Model.Genus, "GenusId", "GenusTitle"), "-- Fill out --")%> 
 

最后我的控制器:

 

     public ActionResult Index(string returnUrl) 
     { 
      AnimalViewModel avm = new AnimalViewModel() 
      { 
       Animal = new Animal(), 
       ReturnUrl = returnUrl, 
       Genus = GenusRepository().GetAll() 
      }; 
      return View(avm); 
     } 
     [HttpPost] 
     public ActionResult Index(AnimalViewModel avm) 
     { 
      if (ModelState.IsValid) //is always false 
      { 
       //save 
       return RedirectToAction("Overview"); 
      } 
      else 
      { 
       Genus = GenusRepository().GetAll(); 
       return View(avm); 
      } 
     } 
 

的ModelState。 IsValid一直在运行错误的。我不知道什么是错的。 客户端验证有效,但服务器验证没有。

任何帮助,将不胜感激。

谢谢!

您没有正确使用DropDownListFor助手。第一个参数表示一个将保存选定值的属性,并且必须是标量类型。在你的情况下,你正在传递一个集合,与第二个参数一样。所以它应该是这样的:

<%: Html.DropDownListFor(
    model => model.Animal.Genus.GenusId, 
    new SelectList(Model.Genus, "GenusId", "GenusTitle"), 
    "-- Fill out --" 
)%> 

还有什么要调用AnimalViewModel是不是一个很好的命名惯例,因为这不是一个视图模型。创建一个类并将所有模型填充为公共属性是对视图模型的错误概念。以下是您的视图模型的外观:

public class AnimalViewModel 
{ 
    [DisplayName("Name")] 
    [Required(AllowEmptyStrings = false, ErrorMessage = "Name is required")] 
    public string AnimalName { get; set; } 

    [DisplayName("Gattung")] 
    [Required(ErrorMessage = "Genus is required")]  
    public int? SelectedGenusId { get; set; } 

    public IEnumerable<SelectListItem> Genus { get; set; } 
}