2011-02-10 79 views
0

我嘗試創建一個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一直在運行錯誤的。我不知道什麼是錯的。 客戶端驗證有效,但服務器驗證沒有。

任何幫助,將不勝感激。

謝謝!

回答

1

您沒有正確使用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; } 
} 
相關問題