c# - 从列表中添加/删除项目作为 View 中模型的属性

标签 c# asp.net-mvc asp.net-mvc-2

我正在使用此处找到的指南 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style并且正在使用 MVC2。

我已经让它与这样的 Controller 方法一起工作:

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

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

如您所见,即使我的模型包含一个 Items 方法,我也必须添加一个 items 参数,因为模型上的属性不是越来越多。

我已经尝试在 BeginCollectionItem 方法中将 items 更改为 Items 并尝试了各种其他值,但我无法获取它无需在 Controller 方法中添加单独的 items 参数即可工作。

tl;dr:如何从 View 中添加/删除/编辑模型的列表属性中的项目?


查看

<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>

局部 View

<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>

最佳答案

这是一个远景,但也许这就是问题所在:

Html.RenderPartial("StockRequestItemEditor", item);

我在 POST 操作中检查 viewModel 时注意到它在集合中具有正确数量的项目,但它们都为空。这向我表明这是模型 Binder 的前缀问题。所以也许这样的事情会奏效:

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

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

我不认为 RenderPartial() 在不使用此重载的情况下传递前缀(尽管可能是错误的)。我不完全确定 bind 前缀是如何工作的,所以我实际上不知道名称是什么,但它似乎与这里相关。该集合中的项目数量肯定对我来说是正确的,但没有一个是正确装订的。

希望这足以促使其他人给您正确的答案。

关于c# - 从列表中添加/删除项目作为 View 中模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884150/

相关文章:

c# - 临时存储文件

c# - 如何阻止 TCP 和 UDP 数据包(洪水攻击)

asp.net-mvc - 为 MVC 应用程序创建帮助和手册

jquery - MVC5 : Bootstrap Accordion Not Working

asp.net - 数据注释应该在模型还是 View 模型上?

c# - mshtml.HTMLTableCell 的 innerText 值不正确

c# - 尝试在数据库表中插入新条目时出现 LINQ to SQL 异常

asp.net-mvc-2 - MVC2 --> MVC3 升级

asp.net - 保存时是否可以排除实体的某些字段?

asp.net-mvc-2 - MVC HttpDelete Verb 导致 405 方法不允许