2011-01-10 4 views
0

Я реализовал привязку модели, показанную ниже. Все работает, как ожидается, только что вложенные свойства не связаны: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." /> 

ответ

2

Я решил проблему в своем специальном случае. Модельное связующее не было проблемой. Проблема заключалась в том, что класс фактической модели аннотированная как это который затем правильно (но нежелательный) исключен клиент (вложенная объект) из процесса связывания:

[MetadataType(typeof(OrderMetatdata))] 
[Bind(Include = "EventDate, PaymentProcessor")] 
partial class Order 
{ 
    ... 

Fixed версии таков:

[MetadataType(typeof(OrderMetatdata))] 
[Bind(Include = "EventDate, PaymentProcessor, Customer")] 
partial class Order 
{ 
    ... 

Если у вас возникли проблемы с привязкой данных Я рекомендую проверить любые аннотации на ваших классах моделей, которые могут быть неправильными, как в моем случае.

0

@ Html.TextBoxFor (модель => model.Order.Customer.Name, new { @class = "formTableLong"})

Это правильный путь, если у вас есть вложенные свойства. Попробуйте удалить свое настраиваемое связующее устройство и посмотреть, работает ли оно. Предлагая это, потому что это единственный чужой кусок кода для меня.

+0

Спасибо за ваш ответ. Тем не менее, не удача. Я узнал следующее. Когда я инициализирую некоторые члены вложенного объекта (например, я устанавливаю в constuctor Order.Customer.Name = «M. Klein»), это начальное значение отображается правильно в форме бритвы, показанной выше. Это приводит меня к утверждению, что строка привязки в основном правильная, но что-то не так с привязкой вложенных объектов. Есть идеи по этому поводу? – mklein

Смежные вопросы