2

ここにあるガイドhttp://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-styleを使用しており、MVC2を使用しています。

私はそれをそのようなコントローラーメソッドで動作させています:

[HttpPost]
public ActionResult CreateStockRequest(StockRequestModel viewModel, List<StockRequestModel.StockRequestItem> items)
{
    viewModel.Items = items;

    // Validate the request and submit it
    return View(viewModel);
}

ご覧のとおり、モデルにメソッドが含まれていても、モデルのプロパティにデータが入力されていないため、パラメーターItemsを追加する必要がありました。items

メソッドでに変更itemsしてみましItemsたが、他のさまざまな値を試しましたが、コントローラーメソッドにBeginCollectionItem個別のパラメーターを追加しないと機能しません。items

tl; dr:ビューから、モデルのリストプロパティのアイテムを追加/削除/編集するにはどうすればよいですか?


意見

<table>
    <thead>
        <tr>
            <td><%= Html.LabelFor(m => m.Items[0].Item )%></td>
            <td><%= Html.LabelFor(m => m.Items[0].Quantity )%></td>
        </tr>
    </thead>
    <tbody id="editorRows">
        <% foreach (var item in Model.Items)
           {
               Html.RenderPartial("StockRequestItemEditor", item);
        }%>
    </tbody>
    <tfoot>
        <tr><td colspan="2">&nbsp;</td></tr>
        <tr>
            <td colspan="2"><%= Html.ActionLink("Add Item...", "BlankEditorRow", null, new { id = "addItem" })%></td>
            <script type="text/javascript">
                $("#addItem").click(function() {
                    $.ajax({
                        url: this.href,
                        cache: false,
                        success: function(html) { $("#editorRows").append(html); }
                    });
                    return false;
                });
            </script>
        </tr>
    </tfoot>
</table>

部分図

<tr>
    <% using(Html.BeginCollectionItem("Items")) { %>
        <td>
            <%= Html.ComboBoxFor(m => m.Item,
                                 null,
                                 Url.Action("Products", "Data", new { area = (string)null }),
                                 Model.Item,
                                 2)%>
        </td>
        <td><%= Html.TextBoxFor(m => m.Quantity)%></td>
    <% } %>
</tr>
4

2 に答える 2

1

ロングショットですが、おそらくこれが問題です。

Html.RenderPartial("StockRequestItemEditor", item);

POSTアクションでviewModelを調べたときに、コレクション内のアイテムの数が正しいことに気付きましたが、それらはすべてnullになります。これは、モデルバインダーのプレフィックスの問題であることを私に示唆しています。したがって、おそらくこのようなものが機能します:

var dictPrefix = new ViewDataDictionary();
dictPrefix.TemplateInfo.HtmlFieldPrefix = "SomePrefix";

Html.RenderPartial("StockRequestItemEditor", item, dictPrefix);

このオーバーロードを使用せずにプレフィックスを渡すことはないと思いますRenderPartial()(ただし、間違っている可能性があります)。バインドプレフィックスがどのように機能するか完全にはわからないので、実際には名前が何であるかはわかりませんが、ここでは関連があるようです。コレクションには間違いなく正しい数のアイテムがありますが、どれも正しくバインドされていません。

うまくいけば、これはあなたに正しい答えを与えるように他の誰かをプッシュするのに十分でしょう。

于 2012-08-09T15:36:57.133 に答える
0

ビューモデルを使ってみませんか?

public class StockRequestModel 
{
    public List<StockRequestItem> Items { get; set; }

    ... some other properties
}

次に、コントローラーアクションにこのビューモデルをパラメーターとして使用させます。

[HttpPost]
public ActionResult CreateStockRequest(StockRequestModel viewModel)
{
    // TODO: do something with viewModel.Items ...

    return View(viewModel);
}

とあなたのビューの内側:

<div class="editorRow">
    <% using(Html.BeginCollectionItem("Items")) { %>
        ...
    <% } %>
</div>
于 2012-08-09T15:12:01.253 に答える