Я пытаюсь обработать http-пост из веб-формы, используя встроенную привязку модели MVC 2. Из того, что я искал последние несколько часов, я понял, что это немного привередливо к «объектам внутри объектов».
Я ищу любые ответы или ссылки на ресурсы, которые могут помочь мне разобраться в этом. Я все еще на ранних стадиях этого тоже, так что, если есть лучший способ - я все уши. Я сам писал Linq-SQL и не использовал генерацию кода. Я думаю, что ближайший ответ, который я ищу, это здесь , но я все еще не понимаю его.
Модель клиента (моя лучшая догадка, где проблема):
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 />
...
Контроллер:
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
...
}
Так что моя проблема в том, что ... когда я вхожу в действие HttpPost, clientForm.Client.Address всегда null . Хотя, когда я смотрю в ModelState (который действителен) или использую Request. ["Key"] , все ключи соответствуют структуре моего объекта. Например, я вижу ModelState ["Client.Address.Address1"] , "Client.Address.Address2" и т. Д.
Все остальные базовые свойства заполнены в порядке, что заставляет меня думать, что код linq-sql нарушает привязку модели. Но как? И есть ли способ это исправить? Если эти ключи находятся в словаре Request / ModelState, почему они не отображаются на объект? Я что-то упускаю из виду?