2011-04-01 4 views
0

모델 바인딩에 내장 된 MVC 2를 사용하여 웹 양식에서 http-post를 처리하려고합니다. 지난 몇 시간 동안 내가 수색 해 왔던 것에서 나는 "물체 내의 사물들"로 다소 까다 롭다 고 생각했다.Linq-SQL이 MVC2 모델 바인딩을 깨뜨리고 있습니까?

나는 이것을 파악하는 데 도움이되는 모든 종류의 답변 또는 링크를 찾고 있습니다. 나는 여전히 이것의 초기 단계에 있으므로 더 좋은 방법이 있다면 - 나는 모든 귀입니다. Linq-SQL을 직접 작성했으며 코드 생성을 사용하지 않았습니다. 내가 찾고있는 가장 가까운 대답은 here이라고 생각하지만, 아직 이해가 안갑니다.

모델 클라이언트 (문제가 어디에 내 추측) :

public class Client 
{ 

    public int ClientID { get; set; } 

    ... 

    [Column(Name = "Address_id")] 
    internal int AddressID { get; set; } 

    internal EntityRef<Address> _address; 
    [System.Data.Linq.Mapping.Association(ThisKey = "AddressID", Storage = "_address")] 
    public Address Address 
    { 
     get { return _address.Entity; } 
     internal set { _address.Entity = value; AddressID = value.AddressID; } 
    } 
} 

모델 주소 (클라이언트 개체 내에서)

public class Address 
{ 
    [Column] public string Address1 { get; set; } 

    [Column] public string Address2 { get; set; } 

    [Column] public string City { get; set; } 

    ... 

보기 모델 :

public class ClientFormViewModel 
{ 
    public Client Client { get; set; } 
    ... 
} 

보기 :

 <!-- id is hidden --> 
     <%: Html.EditorFor(m => m.Client.ClientID) %> 

     ... 

     <%: Html.EditorFor(m => m.Client.Address.AddressID) %> 

     <%: Html.LabelFor(m => m.Client.Address.Address1) %> 
     <%: Html.EditorFor(m => m.Client.Address.Address1) %><br />   

     <%: Html.LabelFor(m => m.Client.Address.Address2) %> 
     <%: Html.EditorFor(m => m.Client.Address.Address2) %><br />     

     ... 

컨트롤러 : 나는 HttpPost 조치에 들어갈 때

public ViewResult Edit(int clientId) 
    { 
     var client = clientsRepository.Clients.First(x => x.ClientID == clientId); 
     ... 

     // create view model 
     var viewModel = new ClientFormViewModel 
     { 
      Client = client, 
      ... 
     }; 

     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Edit(ClientFormViewModel clientForm) 
    { 
     if (ModelState.IsValid) 
     { 
      clientsRepository.SaveClient(clientForm.Client); 
      return RedirectToAction("List"); 
     } 
     else // validation error, so redisplay the same view 
      ... 
    } 

그래서 내 문제는 ...을 clientForm.Client.Address 항상 입니다. 그러나 ModelState (유효 함)을 보거나 Request. [ "key"]을 사용하면 모든 키가 내 개체의 구조와 일치합니다. 예를 들어, 나는 나를 linq-을 생각하게하는

다른 모든 기본 속성

이 잘 채워져 등 ModelState [ "Client.Address.Address1"], "Client.Address.Address2"를 참조하십시오 SQL 코드는 모델 바인딩을 깨고있다. 그러나 어떻게? 그리고 그것을 고칠 수있는 방법이 있습니까? 이러한 키가 Request/ModelState 사전에 있으면 객체에 매핑되지 않는 이유는 무엇입니까? 나는 명백한 무언가를 완전히 놓치고 있는가? 당신이 모델 바인더가 성공적으로 결합 할 수 있도록하려면

+0

시도해보고 싶은 것은 뷰 모델을보기로 전달하여 렌더링 후 모델을 게시 작업에 바인딩하는 것입니다. 나는 당신이 그것을 주변에서 바꾸는 것에 의해 당신 자신을 위해 더 쉽게하고 있다고 생각하지 않는다. :). – Shaun

+0

어쩌면 그것은 너무 깊게 중첩되어 있을까요? 나는 비슷한 일을하지만, EditorFor 람다는 model.Email.EmailAddress입니다. 그래서 성공적으로 하나의 중첩 레벨을 사용하고 있습니다. 또한 양식에 렌더링되는 html을 게시 할 수 있습니까? 어쩌면 Ids/Names가 제대로 렌더링되지 않을 수도 있습니다. – jlnorsworthy

+0

중첩 수준이 문제가 될 것이라고 생각하지 않습니다. 어떤 이유에서든 바인딩되는 모델과 일치하지 않는 기본 모델 바인더에 전달되는 값 때문에 문제가 발생할 가능성이 높습니다. 당신은 언제나 바인더에 전달되는 것을 정확히 확인하기 위해 자신의 모델 바인더를 등록하거나 시도 할 수 있습니다. (그냥 jlnors가 제안한대로 HTML을 보시오 :)) – Shaun

답변

0

@Darin Dimitrov가 도메인 모델 (내가 이미 으로 생각했다.으로 생각한)을 전달하는 대신 뷰 모델을 사용하여 언급 한 후에 솔루션을 찾아 냈습니다.

Linq-SQL 매핑을 선택하는 기본 모델 바인딩 대신에 평평한 뷰 모델을 만들었습니다.가장 나에게 도움이 있었다 무엇

이 두 게시물 :

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

나는 처음에 AutoMapper 몇 가지 문제가 있었다, 그러나 지금은 꽤 잘 작동합니다. 나는 그것을 추천 할 것이다!

0

Address 세터는 public을해야합니다 :

internal EntityRef<Address> _address; 
[System.Data.Linq.Mapping.Association(ThisKey = "AddressID", Storage = "_address")] 
public Address Address 
{ 
    get { return _address.Entity; } 
    set { _address.Entity = value; AddressID = value.AddressID; } 
} 

는 개인적으로 내가와 뷰에서 해당 모델을 뷰 모델을 사용하는 대신 전달을 추천 할 것입니다.

+0

이 [post] (http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.)의 "Pattern 2"와 유사한 viewModel을 사용하고 있습니다. aspx). 기본적으로 내보기 모델 _ 도메인 모델을 포함합니다. "패턴 3"은 당신이 얻고있는 것일 가능성이 가장 큽니까? 나는 이것이 내가 가장 가능성이 있다고 생각하는 것이라고 생각한다. 이 게시물에서 그는 또한 [이 게시물] (http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/)에 링크하여 조금 더 잘 설명하지만, 또한 이 "AutoMapper"가 포함되어 있습니다. 이 사건을 살펴 보는 것이 좋은 일인가? – SlimCharles

관련 문제