ASP.Net MVC 3 - 绑定包含/排除和验证

时间:2011-08-23 19:41:46

标签: asp.net-mvc-3 binding

虽然我使用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以及强类型视图。

1 个答案:

答案 0 :(得分:1)

我认为验证仍假定您要使用有效的模型。即使您现在只绑定了2个属性,其他属性的默认值仍然可以确保有效的模型。如果您想使用这个部分无效的模型并忽略其他字段,您还可以专门检查这两个属性,如果您使用IsValidField方法,您可以传递属性的名称:

  

ModelState.IsValidField(“friend1Id”)&amp;&amp; ModelState.IsValidField( “friend2Id”)

我不完全理解的是,如果您在该属性上没有必需属性,则会出现此类验证错误。或者它只是在你的问题中被截断了?

或者,您可以为此场景设置一个仅包含这两个字段的模型类。它可能更好地描述情况,并且数据库条目的更新也会更清楚(通过id查找现有实体(顺便说一下,哪里是来自当前的id?),并设置持久化实体的属性。随后发布的模型属性。我仍然想知道“if valid”分支中的代码是否真的可以保存你想要的东西......)