14

我的场景是这样的:我有两个列表框,一个包含我所有的数据库项目,一个是空的。用户将完整列表框中所需的项目添加到空列表框中。

我正在使用表单来提交用户添加的所有项目。

问题是,仅提交列表框中的选定项目。因此,如果用户取消选择某些项目,它们将不会在表单中提交。我的观点是这样的:

<% using (Html.BeginForm("MyAction", "MyController"))
   { %>

    <%= Html.ListBox("AddedItems", Model.Items)%>

    <input type="submit" value="Submit" name="SubmitButton"/>
<% } %>

我的控制器看起来像这样:

public ActionResult MyAction(FormCollection formCollection)
{
    var addedItems = formCollection["AddedItems"].Split(',');

    //....more code that does stuff with the items
}

我是否以错误的方式处理所有事情?有没有更好的提交项目的方法?你会怎么做?

4

3 回答 3

23

我也在这样做,我认为我解决它的方式更优雅一些。本质上,我只有一个 Jquery 函数,它在选择所有选项的表单发布之前运行。

    $(function () {
        $("form").submit(function (e) {
            $("#box2View option").attr("selected", "selected");
        });
    });
于 2010-09-18T23:11:54.603 回答
2

因为它只是选择框。您不能在选择框中发布所有值。您必须使用 javascript 来捕获添加的项目并将它们存储在隐藏的输入中。

未经测试的代码,但我认为它可以帮助你。

<script type="text/javascript">
    function addItem() {
        var allItems = document.getElementById("AllItems");
        var op = allItems.options[allItems.selectedIndex];
        var hdSelectedItems = document.getElementById("hdSelectedItems");
        var lbSelectedItems = document.getElementById("lbSelectedItems");

        lbSelectedItems.options[lbSelectedItems.options.length] = op;

        if (hdSelectedItems.value != '') {
             hdSelectedItems.value += ","
        }
        hdSelectedItems.value += op.value;
    }
</script>
<%= Html.Hidden("hdSelectedItems") %>
<%= Html.ListBox("AllItems", Model.Items)%>
<%= Html.ListBox("lbSelectedItems") %>
<a href="#" onclick="addItem(); return false;">Add</a>
于 2010-03-04T22:25:10.190 回答
1

为什么不在复选框中包含项目列表。然后,您可以遍历操作中的复选框并获取所有选定的复选框。

<% foreach(var item in Model.Items) { %>

   <%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id

<% } %>

public ActionResult MyAction(FormCollection formCollection)
{

            foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>())
            {
                 // iterates thru check boxes we got rid of the button 

            }
}
于 2010-03-04T22:20:34.603 回答