【发布时间】:2012-01-08 11:23:41
【问题描述】:
我正在使用 subsonic 在 mvc 应用程序中访问我的数据库。 当尝试使用 mvc 模型绑定更新记录时,记录不会更新,因为没有列被标记为脏。
我尝试通过调整亚音速代码手动将所有列标记为脏,但有时我只想更新一些属性,所以我不想将它们全部标记为脏。
最好的方法是什么?
这是我的行动:
[HttpPost]
public ActionResult Update(mapping m)
{
m.SetIsNew(false);
m.Update(true); // here i tweaked the subsonic code passing true sets all the columns to be dirty and updates the record even though isLoaded=false
return RedirectToAction("New");
}
这就是我调整亚音速代码的方式:
public void Update(IDataProvider provider, Boolean forceUpdate){
if(this._dirtyColumns.Count>0 || forceUpdate){
if(forceUpdate)
this._dirtyColumns = this.Columns.ToList();
_repo.Update(this,provider);
_dirtyColumns.Clear();
}
OnSaved();
}
编辑:
我尝试了这段代码,看看问题出在哪里:
var m = new mapping { ID = 2, Name = "33" };
m.SetIsNew(false);
m.Save();
这也不起作用,列未设置为脏。似乎在使用对象初始化器时不会调用设置器,因此不会将列设置为脏。
我会假设默认的 mvc.net 模型绑定以这种方式工作,这就是记录没有被更新的原因。
编辑 2
正如 @dyork12 指出的那样,我的第一次编辑是错误的。 Subsonic 使用“isLoaded”标志,当它设置为 false 时,设置属性不会将它们设置为脏。这是 subsonic 在加载记录时使用的,以确保在加载时设置属性不会设置为脏。
但我的问题仍然是使用自动模型绑定从 mvc.net 视图编辑亚音速对象的最佳解决方法是什么。
【问题讨论】:
-
在您看来,您是绑定 SubSonic 生成的对象还是使用 ViewModel?你见过这个吗? stackoverflow.com/questions/5491733/…
-
为什么它们没有被标记为脏?该代码片段来自 ActiveRecord,如果您绑定到列属性,它应该都能正常工作。你在做什么不同的事情?请提供更多代码。
-
@dyork12:我在“编辑”中回答。
-
@DaveHogan:我正在接收亚音速生成的对象作为动作中的参数。我看了你链接到的答案。我不确定我是否理解那里的答案,但我尝试使用:AutoMapper.Mapper.Map
(model, person);映射到新对象但无法使其工作。
标签: asp.net-mvc-3 subsonic model-binding