有没有一个预建的ModelBinder可以和LINQ一起使用来从DataContext获取对象并在HTTP post上更新它?
例如,目前我有这样一段代码:
[AcceptVerbs (HttpVerbs.Post)]
public ActionResult Edit (Project project)
{
var projectService = Factory.GetService<IProjectService> ();
project = projectService.GetProject (project.ProjectId);
UpdateModel<Project> (project);
if (!ModelState.IsValid)
return View (project);
project = projectService.SaveProject (project);
return RedirectToAction ("Details", new { id = project.ProjectId });
}(IProjectService将呼叫汇总到线路查询数据上下文)
为了通过LINQ数据上下文实际执行对数据库的更新,我需要再次获取项目实例,然后更新该实例。
任何简单地保存项目实例而不首先从数据上下文获取它的尝试都不会导致任何东西被写回数据库-我假设是因为LINQ数据上下文对对象一无所知,它不会对对象做任何事情。
在Projects表类上使用Attach方法也不起作用,它会抛出一个异常。
发布于 2009-08-18 17:34:17
您应该看看Mike Hadlow(新的BSD) SutekiShop中的实现。
在那里你会找到一个DataBindAttribute和BindUsingAttribute,如果我没理解错的话,它们可以做你想做的事情。请注意,如何使用DataBindAttribute.Fetch属性将传入数据(从HttpPost)重新绑定到LINQ实体。
我使用LINQ和ASP.NET -To-SQL在我的一个项目中遵循了这个模式。它工作得很漂亮。
这是源代码:http://www.google.com/codesearch?hl=en&lr=&q=DataBind+package%3Ahttp%3A%2F%2Fsutekishop.googlecode.com&sbtn=Search
发布于 2009-08-14 13:37:30
我认为您传递给该方法的项目就是您要用来执行UpdateModel的项目,不是吗?
否则,您将尝试使用预先存在的值进行更新,而不是使用新值。
只是一个想法,
丹
下面截取的代码
[AcceptVerbs (HttpVerbs.Post)]
public ActionResult Edit (Project project)
UpdateModel<Project> (project);
if (!ModelState.IsValid)
return View (project);
var projectService = Factory.GetService<IProjectService> ();
project = projectService.SaveProject (project);
return RedirectToAction ("Details", new { id = project.ProjectId });
}发布于 2009-08-14 13:59:51
您需要像这样检索原始项目,然后使用项目中已更改的属性对其进行更新,然后提交更新请求。
编辑
试试我找到的这段代码:
public static void CloneProperties(this object origin, ref object destination)
{
if (destination == null) throw new ArgumentNullException("destination", "Destination object must first be instantiated.");
foreach (var destinationProperty in destination.GetType().GetProperties())
{
if (origin != null && destinationProperty.CanWrite)
{
origin.GetType().GetProperties().Where(x => x.CanRead && (x.Name == destinationProperty.Name && x.PropertyType == destinationProperty.PropertyType)) .ToList() .ForEach(x => destinationProperty.SetValue(destination, x.GetValue(origin, null), null));
}
}
} https://stackoverflow.com/questions/1277524
复制相似问题