4

次のように、モデルのタイプのコレクションを含むViewModelがあります。

public class OrderConfirm
{
    public ICollection<QuoteLine> SalesLines { get; set; }
    public string Currency { get; set; }
    public int EnquiryID { get; set; }
}

私のQuoteLineモデルは次のようになります。

public class QuoteLine
{
    public int QuoteLineId { get; set; }
    public int LostReasonId { get; set; }
    public virtual LostReason LostReason { get; set; }
    public string ItemName { get; set; }
}

私のビューでは、次のように、フォーム内でこれらのQuoteLineのそれぞれを繰り返し処理します。

@using (Ajax.BeginForm("ConfirmLostOrder", new AjaxOptions()
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "LostOrders",
    OnBegin = "LostOrderConfirm"
}))
    {
        <table class="completed-enq-table">
            <tr>
                <th>
                    Item Number
                </th>
                <th>
                    Reason
                </th>
            </tr>
            @foreach (var sales in Model.SalesLines)
            {
                <tr>
                    <td>@sales.ItemName
                        @Html.HiddenFor(model => sales.QuoteLineID)
                    </td>
                    <td>@Html.DropDownListFor(model => sales.LostReasonId, ((IEnumerable<myApp.Models.LostReason>)ViewBag.LostReasons).Select(option => new SelectListItem
       {
           Text = (option == null ? "None" : option.LostReason),
           Value = option.LostReasonId.ToString(),
           Selected = (Model != null) && (option.LostReasonId == sales.LostStatusId)
       }))
                    </td>
                </tr>
            }
        </table>
        <input type="submit" style="float: right;" value="Submit Lost Order" />
    }

次に、私のHttpPostアクションは次のようになります。

[HttpPost]
public ActionResult ConfirmLostOrder(List<QuoteLine> models)
{   
    // process order
    return PartialView("Sales/_ConfirmLostOrder");
}

問題は、modelsがnullであるということです。を使用するFormCollectionと、送信された各値を確認できますが、FormCollectionではなくモデルを使用したいので、個別に送信された各行を処理および編集したいので、理由が異なる可能性があります。

4

1 に答える 1

4

foreachこのインスタンスではを使用できません。デフォルトのモデルバインディングがリストへのバインディングであることを認識できるように、フィールドforの属性に正しいインデックスが含まれるようにループにする必要があります。name

まず、ドロップダウン値をViewBag(実際にそこにあるはずです)から移動します。それはまたあなたの見解でその厄介な論理のいくつかを取り除くでしょう:)

つまり、モデルは次のようになります。

public class OrderConfirm
{
    public List<QuoteLine> SalesLines { get; set; }
    public string Currency { get; set; }
    public int EnquiryID { get; set; }
    public SelectList LostReasons { get; set; }
}

あなたの代わりにこれを試してくださいforeach

@for (var i = 0; i < Model.SalesLines.Count; i++)
{
    <tr>
        <td>
            @Model.SalesLines[i].ItemName
            @Html.HiddenFor(m => m.SalesLines[i].QuoteLineId)
            @Html.HiddenFor(m => m.SalesLines[i].ItemName) //assuming you want this
        </td>
        <td>
            @Html.DropDownListFor(m => m.SalesLines[i].LostReasonId, Model.LostReasons)
       </td>
   </tr>
}

次に、postメソッドを変更してOrderConfirmモデルタイプを取得します。

[HttpPost]
public ActionResult ConfirmLostOrder(OrderConfirm model)
于 2012-05-29T11:13:42.667 に答える