2009-08-14 2 views
1

DataContext에서 개체를 가져 와서 HTTP 게시물에서 업데이트하기 위해 LINQ와 함께 사용할 수있는 미리 빌드 된 ModelBinder가 있습니까?ASP.NET MVC, LINQ 및 ModelBinders

[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 }); 
} 

실제로 LINQ를 통해 데이터베이스에 업데이트를 수행하기 위해

(IProjectService는 LINQ 데이터 컨텍스트에 대한 호출을 래핑) :

예를 들어, 현재 나는 코드 블록을 데이터 컨텍스트에서 프로젝트 인스턴스를 다시 가져온 다음 해당 인스턴스를 업데이트해야합니다.

먼저 데이터 컨텍스트에서 가져 오지 않고 프로젝트 인스턴스를 저장하려고 시도하면 아무 것도 데이터베이스에 다시 쓰지 않습니다. LINQ 데이터 컨텍스트가 아무것도 수행하지 않는 개체에 대해 아무것도 모르기 때문에 가정합니다. 그것으로.

Projects 테이블 클래스의 Attach 메서드를 사용하면 btw가 작동하지 않고 예외가 발생합니다.

답변

3

당신은 마이크 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

+0

그게 바로 로버트 감사합니다! – Kieron

+0

SutekiShop에는 훌륭한 코드가 많이있어서 다행입니다. –

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 }); 
} 
+0

프로젝트가 아닌 projectToUpdate 내가 잘 설명하지 ModelBinder를 –

+0

문제를 사용하여 하나, 바인더에서 오는 프로젝트 인스턴스가 떨어져, 잘하고 좋은 것입니다 사실 그것은 MVC FW에 의해 어딘가에 만들어졌고 DataContext에서 검색되지 않았다는 사실로부터입니다. 해당 인스턴스를 업데이트 할 때 DataContext는 기본적으로 아무 것도하지 않습니다. 아마도 그 객체에 대해 아무 것도 모르기 때문입니다. – Kieron

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)); 
     } 
    } 
} 
+0

그래, 그게 내가하고있는 일이다. 내가 원하는 것은 나에게 그렇게 할 수있는 ModelBinder를 만드는 것이다. 간단히 말해서 매번 컨트롤러를 사용할 필요가 없다. 나중에 다른 ORM으로 변경하면 필요없는 추가 가져 오기가 수행됩니다. 바인더로해야 할 일은 원본을 제거/복원하는 것뿐입니다. 이견있는 사람? – Kieron

+0

http://msdn.microsoft.com/en-us/library/bb896248.aspx – Gregoire

+0

@Gregorie, 나는 Attach 메서드를 사용하여 잠시 후에 시도했지만 개체에 대한 예외를 이미 throw합니다. 그것에 PK). – Kieron