2011-02-06 5 views
3

필자는 Phil Haack의 article리스트에 대한 바인딩을 읽었으므로 하나의 뷰에서 제대로 작동합니다. 하지만 마스터 레코드에서 그 일을 할 때 내가 갇혀있는 것. 나는이 개체에 대해 정말 간단한 양식을 가지고MVC 3 마스터/디테일 UpdateModel은 기존 레코드를 업데이트하는 대신 새로운 세부 레코드를 삽입합니다.

public class Master 
{ 
    public int ID { get; set; } 
    public string MasterTitle { get; set; } 
    public virtual IList<Detail> Details { get; set; } 
} 

public class Detail 
{ 
    public int ID { get; set; } 
    public string DetailName { get; set; } 
    public virtual Master Master { get; set; } 
} 

양식 모음이 예상 접두사로 돌아 오기 :

[0] "" 
    [1] "ID"  
    [2] "MasterTitle" 
    [3] "Details[0].ID" 
    [4] "Details[0]"  
    [5] "Details" 
    [6] "Details[0].DetailName" 
    [7] "Details[1].ID" 
    [8] "Details[1]"  
    [9] "Details[1].DetailName" string 

그리고 Controller.UpdateModel (마스터)이 결합 모든 속성을 올바르게. 내가 dbContext.SaveChanges를 호출 할 때하지만 그 작동 주위

update detail1 set masterID = null 
update detail2 set masterID = null 
update master set masterName = 'newname' 
insert detail1 ... 
insert detail2 ... 

내가 작품을 가지고 있지만, 꽤 hackish 그리고 나는 현재 그렇게 키를 일치하고 있지 않다 (사이비 코드) SQL 프로파일 러에서 추적의 SQL을 발행 올바른 순서로 돌아 오는 모든 것에 의존합니다. 또한 업데이트 할 모든 필드를 포함시켜야합니다.

public ActionResult Edit(FormCollection collection) 
    { 
     try 
     { 
      using (var ctx = new PlayContext()) 
      { 
       var id = int.Parse(collection["ID"]); 
       Master master = ctx.Master.Find(id); 

       UpdateModel(master, new [] {"MasterTitle"}); 
       for (int i = 0; i < master.details.Count; i++) 
       { 
        UpdateModel(master.details[i], "Details[" + i + "]", new[] { "DetailName" }); 
       } 

       ctx.SaveChanges(); 
       return View(master); 
      } 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("", e); 
     } 
     return View(); 
    } 

나는 UpdateModel이 어떻게 든 아이들을 제거하고 다시 추가한다고 생각합니다.

다른 사람이이 기능을 사용하고 있습니까? 물론, 수건을 던져서 색인 된 필드 이름을 파싱 할 수는 있지만 너무 가깝습니다.

+0

UpdateModel에는 어떤 것이 있습니까? –

+0

UpdateModel이 기본 컨트롤러 클래스에 있습니다. – DanielEli

답변

1

MVC2에서 비슷한 코드에 문제가 없었습니다.

그래도 난이 라인에 대한 걱정 : [5] "세부 사항"

는 세부 사항을 다시 보내는 일이야? MVC 3에서 모델 바인더가 어떻게 작동하는지 완전히 알 수는 없지만이 줄은 Details 컬렉션을 NULL로 설정하게됩니다.

특정 순서로 반환되는 입력란에 의존 할 필요가 없습니다. 바인더는 어떤 순서로든 처리하도록 설계되었습니다.