2011-02-10 19 views
0

私はasp.net mvc 2アプリケーションを作成しようとしています。 私のDropDownListは検証されません!DropDownListの検証 - ModelState.IsValidは常にfalseです。

私はいくつかの属性を持つAnimalというコアモデルクラスを持ち、Genusクラスにも同じクラスを持っています。これらのクラスはnHibernateにマップされます。私のUIプロジェクトで


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; } 
    } 
} 
 

私は

 

    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() { } 
    } 
 

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ヘルパーは正しく使用されていません。最初の引数は、選択された値を保持するプロパティを表し、スカラー型でなければなりません。あなたの場合、2番目の引数として使用されているコレクションを渡しています。だから、それは次のようにする必要があります:これは、ビューモデルではありませんので、あなたがAnimalViewModelを呼び出しているものも

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

ことは良い命名規則ではありません。クラスを作成し、すべてのモデルをパブリックプロパティとして内部に埋め込むことは、ビューモデルの誤った考えです。ビューモデルの実際の表示方法は次のとおりです。

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; } 
} 
関連する問題