我已经实现了如下所示的模型绑定器。一切都按预期工作,只是嵌套属性没有绑定:
我正在使用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." />
答案 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”})
如果您有嵌套属性,这是正确的方法。尝试删除自定义模型绑定器,然后查看它是否有效。建议这是因为这是我唯一的外来代码。