首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC、LINQ和ModelBinders

ASP.NET MVC、LINQ和ModelBinders
EN

Stack Overflow用户
提问于 2009-08-14 12:12:46
回答 3查看 596关注 0票数 1

有没有一个预建的ModelBinder可以和LINQ一起使用来从DataContext获取对象并在HTTP post上更新它?

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

代码语言:javascript
复制
[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方法也不起作用,它会抛出一个异常。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2009-08-14 13:37:30

我认为您传递给该方法的项目就是您要用来执行UpdateModel的项目,不是吗?

否则,您将尝试使用预先存在的值进行更新,而不是使用新值。

只是一个想法,

下面截取的代码

代码语言:javascript
复制
[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 });
}
票数 0
EN

Stack Overflow用户

发布于 2009-08-14 13:59:51

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

编辑

试试我找到的这段代码:

代码语言:javascript
复制
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)); 
       } 
    } 
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1277524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档