两个模型类:
public class Academy
{
public virtual int Id { get; set; }
[Required(ErrorMessage = "学院名称不能为空")]
[StringLength(20, ErrorMessage = "学院名称不能少于或超过20字符")]
public virtual string Name { get; set; }
}
public class Teacher
{
public virtual int Id { get; set; }
[Required(ErrorMessage = "帐户名称不能为空")]
[StringLength(20,ErrorMessage = "帐户名称不能超过20个字符")]
public virtual string Name { get; set; }
public virtual Academy Academy { get; set; }
}
现在我有一个方法:
[HttpPost]
public ActionResult Add(Teacher teacher)
{
//TODO:Not Finished
if(ModelState.IsValid)
{
_teacherService.AddTeacherInfo(teacher);
return RedirectToAction("Add");
}
}
传入这个方法的teacher类的信息有
teacher.Name = “xxx”
teacher.Academy.Id = "XX"
而teacher.Academy.Name 为 NULL (由于前台绑定的是一个DropDownList 所以这里只返回了teacher.Academy.Id)
现在问题出现了:ModelState.IsValid 一直为false 原因是teacher.Academy.Name 没有通过验证!!!
请问有什么好的解决方案吗?
为 Name属性赋值,或者 单个属性进行验证
不要标记为 [Required] 试试,如果不能去掉
那你就在 调用ModelState.IsValid 之前 ,把这个错误清除
ModelState["xxx"].Errors.Clear();
你所说的方法是可以的
但我觉得ModelState["xxx"].Errors.Clear() 这个方法不够优雅
我觉得理想的实现方案是
public class Teacher
{
public virtual int Id { get; set; }
[Required(ErrorMessage = "帐户名称不能为空")]
[StringLength(20,ErrorMessage = "帐户名称不能超过20个字符")]
public virtual string Name { get; set; }
public virtual Academy Academy { get; set; }
}
在Academy上配置一个不验证的特性 不知道行不行呢
@teroy: 你可以自定义一个继承ValidationAttribute的特性类来验证,但Required就不能使用了
也遇到过,一直找不出来原因,没深究,直接让它不在后台验证了
增加一个隐藏域,在DropDownList变化时把name赋值给隐藏域
<input type="hidden" name="teacher.Academy.Name">
你这个牵涉到复杂属性的模型绑定问题,你可以增加一个隐藏域
<input type="hidden" name="Academy_Name" value="你要绑定的值">
可怜的孩子。