ASP.NET MVC 3绑定嵌套属性

时间:2011-01-10 00:06:07

标签: asp.net-mvc asp.net-mvc-3

我已经实现了如下所示的模型绑定器。一切都按预期工作,只是嵌套属性没有绑定:

  • Order.Customer.Name< - 未绑定在OrderModelBinder中,但初始值以正确的形式显示(导致前缀正确的假设)
  • 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 个答案:

答案 0 :(得分:2)

我在特殊情况下解决了这个问题。模型绑定器不是问题。问题是实际的模型类是这样注释的,然后正确地(但不需要)将Customer(嵌套对象)从绑定过程中排除:

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

修正版是这样的:

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

如果您对数据绑定有任何问题,我建议您检查模型类上的任何注释,这些注释可能与我的情况有关。

答案 1 :(得分:0)

  

@ Html.TextBoxFor(model =&gt;   model.Order.Customer.Name,new {   @class =“formTableLong”})

如果您有嵌套属性,这是正确的方法。尝试删除自定义模型绑定器,然后查看它是否有效。建议这是因为这是我唯一的外来代码。