1

是否有一个预构建的 ModelBinder 可以与 LINQ 一起使用以从 DataContext 获取对象并在 HTTP 帖子上更新它?

例如,目前我有这段代码:

[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 数据上下文实际执行对数据库的更新,我需要再次获取项目实例,然后更新该实例。

任何尝试简单地保存项目实例而不首先从数据上下文中获取它都会导致没有任何内容被写回数据库 - 我假设因为 LINQ 数据上下文对它不做任何事情的对象一无所知。

顺便说一句,在 Projects 表类上使用 Attach 方法也不起作用,它会引发异常。

4

3 回答 3

3

您应该查看 Mike Hadlow 的(新 BSD)SutekiShop中的实现。

在那里你会找到一个 DataBindAttribute 和 BindUsingAttribute ,如果我理解正确的话,它会做你想做的事。请注意 DataBindAttribute.Fetch 属性如何用于将传入数据(来自 HttpPost)重新绑定到 LINQ 实体。

我在我的一个使用 ASP.NET MVC 和 LINQ-To-SQL 的项目中遵循了这种模式。它工作得很好。

这是来源:http ://www.google.com/codesearch?hl=en&lr=&q=DataBind+package%3Ahttp%3A%2F%2Fsutekishop.googlecode.com&sbtn=Search

于 2009-08-18T17:34:16.973 回答
0

我认为您传递给该方法的项目是您想要执行 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-14T13:37:30.473 回答
0

您需要像以前一样检索原始项目,然后使用项目中已更改的属性对其进行更新,以进行更新,然后提交更新请求。

编辑

试试我发现的这段代码:

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)); 
       } 
    } 
} 
于 2009-08-14T13:59:51.010 回答