【问题标题】:formcollection only holds the selected html.listbox items values? MVCformcollection 只保存选定的 html.listbox 项目值? MVC
【发布时间】:2011-01-23 21:30:23
【问题描述】:

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

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

问题是,只有从列表框中选择的项目被提交。因此,如果用户取消选择某些项目,它们将不会在表单中提交。我的看法是这样的:

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

我是不是走错了路?有没有更好的提交项目的方法?你会怎么做?

【问题讨论】:

    标签: asp.net-mvc listbox formcollection


    【解决方案1】:

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

        $(function () {
            $("form").submit(function (e) {
                $("#box2View option").attr("selected", "selected");
            });
        });
    

    【讨论】:

    • 是的,这实际上是我最终做的。
    【解决方案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>
    

    【讨论】:

    • 谢谢,我采用了类似的解决方案。我刚刚将项目添加到 Hidden 并从控制器中的 FormCollection 中获取它
    • 一点也不,其他选项比这简单,您可以在提交表单时选择所有项目,但我认为这不是一个好的解决方案。
    【解决方案3】:

    为什么没有复选框中的项目列表。 然后您可以遍历操作中的复选框并获取所有选中的复选框。

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

    【讨论】:

    • 数据库项目实际上可能有数千个。在大多数情况下,用户需要的项目范围为 1 到 10。我想要一种简单的方法让用户查看所有选择的项目。我希望我可以绑定 html.listbox 或其他东西并以这种方式获取所有项目......真的不知道这是否可能/正确的方法
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多