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