虽然我使用Bind-Include只编辑对象属性的一部分,但是对于未包含的属性的验证仍在激活,表单提交后我的模型状态无效。
以下是我的模型的简化版本:
public partial class MyObject
{
public int MyObjectId { get; set; }
public int personId { get; set; }
public string myString1 { get; set; }
public Nullable<int> friend1Id { get; set; }
public Nullable<int> friend2Id { get; set; }
public virtual People person { get; set; }
public virtual People Friend1 { get; set; }
public virtual People Friend2 { get; set; }
}
我有一个控制器只能编辑该对象上的朋友(Friend1和Friend2),如下所示:
[HttpPost]
public ActionResult Assignation([Bind(Include = "friend1Id,friend2Id")]MyObject myObject)
{
if (ModelState.IsValid)
{
db.Entry(myObject).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.friend1Id = new SelectList(db.People, "personId", "Name", myObject.friend1Id);
ViewBag.friend2Id = new SelectList(db.Divisions, "personId", "Name", myObject.friend2Id);
return View(myObject);
}
在我看来,我只有2个下拉列表来选择朋友,还有一个保存按钮。但是,当我点击保存时,我的模型返回无效。如果我在ModelState中查看属性集合,我会发现一条错误消息,指出myString1是必需的。 myString1在数据库中的类型为nvarchar(100)NOT NULL,但我认为该字段没有验证,因为我没有在我的绑定中包含它。我对Bind的理解是错的吗?请耐心等待,我是ASP.Net MVC的新手。我正在使用MVC 3和EF 4.1以及强类型视图。
答案 0 :(得分:1)
我认为验证仍假定您要使用有效的模型。即使您现在只绑定了2个属性,其他属性的默认值仍然可以确保有效的模型。如果您想使用这个部分无效的模型并忽略其他字段,您还可以专门检查这两个属性,如果您使用IsValidField方法,您可以传递属性的名称:
ModelState.IsValidField(“friend1Id”)&amp;&amp; ModelState.IsValidField( “friend2Id”)
我不完全理解的是,如果您在该属性上没有必需属性,则会出现此类验证错误。或者它只是在你的问题中被截断了?
或者,您可以为此场景设置一个仅包含这两个字段的模型类。它可能更好地描述情况,并且数据库条目的更新也会更清楚(通过id查找现有实体(顺便说一下,哪里是来自当前的id?),并设置持久化实体的属性。随后发布的模型属性。我仍然想知道“if valid”分支中的代码是否真的可以保存你想要的东西......)