2011-02-10 2 views
0

asp.net mvc 2 응용 프로그램을 만들려고합니다. 내 DropDownList가 유효하지 않습니다!DropDownList 유효성 검사 - ModelState.IsValid는 항상 거짓입니다.

나는 Animus라는 속성을 가진 핵심 모델 클래스와 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

라는 뷰 모델 클래스가 여기 내보기입니다 :

 

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는 항상 그렇다. s 거짓. 나는 무엇이 잘못되었는지 전혀 모른다. 클라이언트 유효성 검사가 작동하지만 서버 유효성 검사가 작동하지 않습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

답변

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; } 
} 
관련 문제