Я реализовал привязку модели, показанную ниже. Все работает, как ожидается, только что вложенные свойства не связаны:ASP.NET MVC 3 Связывание вложенных свойств
- Order.Customer.Name < - не связан в OrderModelBinder, но начальные значения корректно показаны в форме (что приводит меня к assuption, что префиксы являются правильными)
- Order.EventDate < - это связано правильно и значения правильно представлены в виде
Я использую MEF, чтобы получить хранилище данных в связующем. Должна ли привязка к вложенному имени свойства работать, или я пропущу точку? Вызывает base.BindModel (...) правильный путь?
[Export(typeof(OrderModelBinder))] public class OrderModelBinder : DefaultModelBinder
{
private readonly IProjectEntities _data;
private const string _orderSessionKey = "OrderSessionKey";
[ImportingConstructor]
public OrderModelBinder([Import]IProjectEntities data)
{
_data = data;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Order order = (Order)controllerContext.HttpContext.Session[_orderSessionKey];
if (order == null)
{
order = new Order();
order.Customer = new Customer();
controllerContext.HttpContext.Session[_orderSessionKey] = order;
_data.Orders.AddObject(order);
}
bindingContext.ModelMetadata.Model = order;
return base.BindModel(controllerContext, bindingContext);
}
}
Это контроллер, где почтовые земли:
[HttpPost]
public ActionResult ShipmentDetails(Order order)
{
// do stuff here
}
Это часть вида бритвы с формой:
@using(Html.BeginForm())
{
@Html.ValidationSummary()
<table class="formTable">
<tbody>
...
<tr>
<td class="formTableLabel">@Html.LabelFor(model => model.Order.Customer.Name)</td>
<td>@Html.TextBoxFor(model => model.Order.Customer.Name, new { @class = "formTableLong" })</td>
<td>@Html.ValidationMessageFor(model => model.Order.Customer.Name)</td>
</tr>
...
<input type="submit" value="Go on." />
Спасибо за ваш ответ. Тем не менее, не удача. Я узнал следующее. Когда я инициализирую некоторые члены вложенного объекта (например, я устанавливаю в constuctor Order.Customer.Name = «M. Klein»), это начальное значение отображается правильно в форме бритвы, показанной выше. Это приводит меня к утверждению, что строка привязки в основном правильная, но что-то не так с привязкой вложенных объектов. Есть идеи по этому поводу? – mklein