모델 바인딩에 내장 된 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 사전에 있으면 객체에 매핑되지 않는 이유는 무엇입니까? 나는 명백한 무언가를 완전히 놓치고 있는가? 당신이 모델 바인더가 성공적으로 결합 할 수 있도록하려면
시도해보고 싶은 것은 뷰 모델을보기로 전달하여 렌더링 후 모델을 게시 작업에 바인딩하는 것입니다. 나는 당신이 그것을 주변에서 바꾸는 것에 의해 당신 자신을 위해 더 쉽게하고 있다고 생각하지 않는다. :). – Shaun
어쩌면 그것은 너무 깊게 중첩되어 있을까요? 나는 비슷한 일을하지만, EditorFor 람다는 model.Email.EmailAddress입니다. 그래서 성공적으로 하나의 중첩 레벨을 사용하고 있습니다. 또한 양식에 렌더링되는 html을 게시 할 수 있습니까? 어쩌면 Ids/Names가 제대로 렌더링되지 않을 수도 있습니다. – jlnorsworthy
중첩 수준이 문제가 될 것이라고 생각하지 않습니다. 어떤 이유에서든 바인딩되는 모델과 일치하지 않는 기본 모델 바인더에 전달되는 값 때문에 문제가 발생할 가능성이 높습니다. 당신은 언제나 바인더에 전달되는 것을 정확히 확인하기 위해 자신의 모델 바인더를 등록하거나 시도 할 수 있습니다. (그냥 jlnors가 제안한대로 HTML을 보시오 :)) – Shaun