Проверка DropDownList - ModelState.IsValid всегда ложно - PullRequest
0 голосов
/ 10 февраля 2011

Я пытаюсь создать приложение asp.net mvc 2. Мой DropDownList не будет проверен!

У меня есть базовый модельный класс Animal с некоторыми атрибутами и такой же для класса Genus. Эти классы отображаются в 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 Project есть класс ViewModel с именем 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() { }
    }

Вот мой взгляд:


 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 Ответ

2 голосов
/ 10 февраля 2011

Вы не используете хелпер 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...