如何将编辑器模板与默认对象实例一起使用

时间:2012-05-14 15:55:12

标签: c# asp.net-mvc-3 razor

在我的视图文件中,我当前有以下代码:

    @if ((Model.CustomerOrderTrackings != null) && (Model.CustomerOrderTrackings.Count > 0)) {
        for (int i = 0; i < Model.CustomerOrderTrackings.Count; i++) {
            @Html.EditorFor(m => m.CustomerOrderTrackings[i])
        }
    } else {
        @*The problem is here*@
        @Html.EditorFor(m => new CustomerOrderTracking())
    }

然后,我的编辑器模板如下所示:

@model Models.CustomerOrderTracking

<tr class="gridrow">
    <td class="carrierName">
        @Html.HiddenFor(m => m.Id, new { id = "" })
        @Html.HiddenFor(m => m.ShipperId, new { id = "", @class = "trackingShipperId" })
        @Html.DropDownListFor(m => m.CarrierName, ViewExtensions.ToFriendlySelectList<CustomerOrderTracking.CarrierNames>(Model.CarrierName), new { id = "" })
    </td>
    <td class="service">@Html.DropDownListFor(m => m.ShippingType, ViewExtensions.ToFriendlySelectList<CustomerOrderTracking.ShippingTypes>(Model.ShippingType), new { id = "" })</td>
    <td class="trackingNumber">@Html.TextBoxFor(m => m.ShippingTrackingNumber, new { @class = "trackingInput", id = "" }) <a href="" target="_blank" class="icon track"></a></td>
    <td class="shippingCost">
        @Html.TextBoxFor(m => m.ShippingCost, new { @class = "shippingInput", id = "" })
        <div onclick="Operations.Orders.DeleteTrackingRow(this)" class="icon delete deleteTracking" title="Delete this shipment?"></div>
    </td>
</tr>

我正在尝试做的是在当前没有任何项目附加到对象的情况下向此表添加默认行。该对象的新实例不起作用,因为这会导致以下错误:Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

我可以对输入进行手工编码,但是我的代码相当邋is,因为我将使用手工编码的输入,然后从ASP.NET MVC扩展中自动生成输入。

有没有办法可以将对象的默认实例传递给我的编辑器模板?

2 个答案:

答案 0 :(得分:1)

我认为,在MVC框架中,实现目标的方法是在控制器中检测您的需求,并在到达视图之前根据需要调整模型。另一个答案,就是99%的宗教财产方式,就是在你看来有逻辑(呃!)。

public ActionResult SomeAction()
{

  if (model.CustomerOrderTrackings == null 
      || model.CustomerOrderTrackings.Count > 0) 
  {
    // Do Something with model
  }

  this.View(model)
}

答案 1 :(得分:0)

  

在我的视图文件中,我当前有以下代码:

@if ((Model.CustomerOrderTrackings != null) && (Model.CustomerOrderTrackings.Count > 0)) {
    for (int i = 0; i < Model.CustomerOrderTrackings.Count; i++) {
        @Html.EditorFor(m => m.CustomerOrderTrackings[i])
    }
} else {
    @*The problem is here*@
    @Html.EditorFor(m => new CustomerOrderTracking())
}

解决方法是在Html EditorFor之外声明模型的实例。 例如:

@if ((Model.CustomerOrderTrackings != null) && (Model.CustomerOrderTrackings.Count > 0)) {
    for (int i = 0; i < Model.CustomerOrderTrackings.Count; i++) {
        @Html.EditorFor(m => m.CustomerOrderTrackings[i])
    }
} else {
    @{ CustomerOrderTracking stubModel = new CustomerOrderTracking(); }
    @Html.EditorFor(m => stubModel)
}