Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc formcollection仅保存选定的html.listbox项值?MVC_Asp.net Mvc_Listbox_Formcollection - Fatal编程技术网

Asp.net mvc formcollection仅保存选定的html.listbox项值?MVC

Asp.net mvc formcollection仅保存选定的html.listbox项值?MVC,asp.net-mvc,listbox,formcollection,Asp.net Mvc,Listbox,Formcollection,我的场景是这样的:我有两个列表框,一个包含所有数据库项,另一个是空的。用户将所需的项目从完整列表框添加到空列表框 我正在使用表单提交用户添加的所有项目 问题是,仅提交列表框中选定的项目。因此,如果用户取消选择某些项目,它们将不会在表单中提交。我的看法是这样的: <% using (Html.BeginForm("MyAction", "MyController")) { %> <%= Html.ListBox("AddedItems", Model.Items)

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

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

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

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

我是不是把一切都搞错了?是否有更好的方式提交项目?你会怎么做?

为什么不在复选框中列出项目列表。 然后,您可以迭代操作中的复选框,并获取所有选中的复选框

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

            }
}

//由项目id标记的每个项目
公共操作结果MyAction(FormCollection FormCollection)
{
foreach(collection.AllKeys.Where(k=>!k.Contains(“SubmitButton”)).ToArray()中的var键)
{
//通过复选框进行迭代我们去掉了按钮
}
}

因为它只是选择框。您不能在selectbox中发布所有值。您必须使用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>

函数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;
如果(hdSelectedItems.value!=''){
hdSelectedItems.value+=“,”
}
hdSelectedItems.value+=op.value;
}

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

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

数据库中的项目可能有数千个。在大多数情况下,用户需要的物品范围为1-10件。我想让用户以一种简单的方式查看所选的所有项目。我希望我可以绑定html.listbox或其他什么东西,并以这种方式获取所有项目…我真的不知道这是否可行/正确的方法谢谢我使用了类似的解决方案。我只是将项目添加到一个隐藏的文件夹中,并从我的表单集合中获取它。根本没有,其他选项比这更简单,你可以在提交表单时选择所有项目,但我认为这不是一个好的解决方案。是的,这实际上就是我最终要做的。