有一种简单的方法可以避免在使用模型绑定时将空值保存到数据库中

时间:2013-08-10 16:26:50

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我正在使用MVC3,Razor,C#,.NET4,EF5。

我有很多情况下我直接编辑域模型,是的,我知道我应该使用View Models :)但是从短期来看,我希望我能找到解决问题的方法,我就是将空值保存到数据库中,其中这些字段未在表单中指定为隐藏字段。我意识到这与模型绑定行为有关。

我的编辑操作:

    public ActionResult Edit(int id)
    {
        StdOrg myOrg = db.StdOrg.Single(s => s.Id == id);
        return View(myOrg);
    }

假设我的View上有5个字段:

Name
Address1
Address2
Address3
Address4

现在我的帖子编辑操作:

 [HttpPost]
 public ActionResult Edit(StdOrg myOrg)
 {
 if (ModelState.IsValid)
   {
     db.StdOrg.Attach(myOrg);
     db.ObjectStateManager.ChangeObjectState(myOrg, EntityState.Modified);
     db.SaveChanges();
     return RedirectToAction("Index");
   }
 return View(myOrg);
 }

现在我的表记录中有10列,第6-10列有值。

Name
Address1
Address2
Address3
Address4
Terms
EmployeeNo
Code
Active
SetUpDate

当我保存表单时,第6-10列即条款等设置为null。现在我意识到这是因为我没有在视图中将它们指定为隐藏字段,因此MVC模型绑定假设它们为空。

是否有实用的方法,而不是指定表单中的所有列,出于安全原因我宁愿不这样做。

非常感谢提前。

修改

我的尝试似乎不起作用:

    [HttpPost]
    public ActionResult Edit([Bind(Include = "Id,Name,Name,Address1,Address2,Address3,Address4")] StdOrg myOrg)

想法...... ???

结论

对于那些感兴趣的人,我最终使用了“Value Injector”,这是另一个“Automapper”,我为此编写了一个简单的匹配例程来防止设置空值,同时也排除了导航属性。非常有用的Mapper。

仍然需要实现ViewModel,因为这些似乎是识别视图中哪个类属性的唯一方法,除非可以使Bind属性工作,但我无法工作。 否则,即使使用映射器,也无法将View字段重置为null,因为映射器将确保忽略它!就我所见,它无法在视图属性和域类中的其他人之间进行分析。

2 个答案:

答案 0 :(得分:1)

尝试使用BindAttribute,您可以简单地排除或包含该特定操作的字段(这总是很好的做法,有人可以操作POST上的ID字段并修改不同的值)。

请参阅this question以获取示例

答案 1 :(得分:0)

尽管放置了Exclude:

[Bind(Exclude = "PropertyName,PropertyType")]
public class Filter {

    public string PropertyName { get; set; }
    public Type PropertyType { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public string Match { get; set; }
}

当我从模型中调用此方法时,这些属性似乎被NULL覆盖(注意:PropertyName和PropertyType不是并且一定不能出现在标记中!它们在代码中填充一次,然后再进行标记)

[HttpPost]
public virtual PartialViewResult LoadFiltered(string entityType, IDictionary<string, Filter> filters)

当没有选择任何元素时(在界面中禁用所有过滤器) - 我得到两个元素,将“controller”和“action”作为键。什么...... ??