没有从MVC中Post上的ListBoxFor和MultiSelectList获取表单数据

时间:2017-08-02 16:27:01

标签: c# asp.net asp.net-mvc razor

我正在努力从我在两个组之间进行排序的表单的帖子中获取数据。表格看起来像这样。 Group Manager 正如你所看到的,get动作效果很好,整个页面工作得很好..这是.cshtml视图

@model InfoKeeper.Models.GroupManageVewModel
@{
    ViewBag.Title = "ManageGroup";
}

<h2>ManageGroup</h2>
@using (Html.BeginForm("ManageGroup","GroupManager", FormMethod.Post))
{
    <div class="nav-block">
        <div class="row">
            <div class="col-xs-3 col-xs-pull-1 col-xs-offset-2">
                <p>Available Groups</p>
                @Html.HiddenFor(m => m.GroupID)
                @Html.HiddenFor(m => m.CustomerID)
                @Html.ListBoxFor(m => m.ResultAvailable, Model.AvailableDepartmentsSL, new { @Name = "from[]", @id = "multiselect", @class = "form-control", @size = "8", @multiple = "multiple", @style = "min-width: 350px;margin-right:50px;" })
            </div>

            <div class="col-xs-2" style="padding-top:25px;">
                <button type="button" id="multiselect_rightAll" class="btn btn-block"><i class="glyphicon glyphicon-forward"></i></button>
                <button type="button" id="multiselect_rightSelected" class="btn btn-block"><i class="glyphicon glyphicon-chevron-right"></i></button>
                <button type="button" id="multiselect_leftSelected" class="btn btn-block"><i class="glyphicon glyphicon-chevron-left"></i></button>
                <button type="button" id="multiselect_leftAll" class="btn btn-block"><i class="glyphicon glyphicon-backward"></i></button>
                <input type="submit" value="save" class="btn btn-block btn-success">
            </div>

            <div class="col-xs-3">
                <p>Departments in Group</p>
                @Html.ListBoxFor(m => m.ResultInGroup, Model.DepartmentsInGroupSL, new { @Name = "to[]", @id = "multiselect_to", @class = "form-control", @size = "8", @multiple = "multiple", @style = "min-width: 350px" })
            </div>
        </div>
    </div>
}

此外,这是控制器......

public ActionResult ManageGroup(int GroupID, int CustomerID)
{
    GroupRepo repo = new GroupRepo();

    var model = repo.ManageGroup(GroupID, CustomerID);

    model.AvailableDepartmentsSL = new MultiSelectList(model.AvailableDepartments, "Key", "Value");
    model.DepartmentsInGroupSL = new MultiSelectList(model.DepartmentsInGroup, "Key", "Value");

    return View(model);
}

和模型......

public class GroupManageVewModel
    {
        public MultiSelectList AvailableDepartmentsSL { get; set; }
        public MultiSelectList DepartmentsInGroupSL { get; set; }
        public Dictionary<int, string> DepartmentsInGroup { get; set; }
        public Dictionary<int, string> AvailableDepartments { get; set; }
        public int GroupID { get; set; }
        public int CustomerID { get; set; }
        public string GroupName { get; set; }
        public IEnumerable<int> ResultAvailable { get; set; }
        public IEnumerable<int> ResultInGroup { get; set; }
    }

但是当我提交表格时...这就是我在Post上得到的......

WAT

因此,表单是发布某些内容 ... HiddenFors。但是出于什么原因我的ResultAvailable和ResultInGroup为空...请帮忙!

2 个答案:

答案 0 :(得分:0)

您需要将List<int>用于ResultInGroup媒体资源。模型绑定器无法绑定到IEnumerable,因为它不支持索引。

答案 1 :(得分:0)

好的,我现在得到了理想的结果。答案在于克里斯普拉特让我上场的一些想法......

  

好!因此,当表单提交每个选项中的选项元素时,确实会被选中。执行该操作的代码位于源代码中。它必须是别的...我认为它与SelectList的名称有关...为了使插件工作,我必须将选择列表的名称更改为“from []”并且“到[]”它必须与此有关......当在MVC中我相信它们通常被命名为它们必须的道具...将报告回来

我100%正确(我永远不会这么说。)

当我将这个表单放在一起并使插件正常工作时,我最初从我的视图中的文档中获得了代码看起来像......

     <select name="from[]" id="multiselect" class="form-control" size="8" multiple="multiple">
        <option value="1">Item 1</option>
        <option value="2">Item 5</option>
        <option value="2">Item 2</option>
        <option value="2">Item 4</option>
        <option value="3">Item 3</option>
    </select>

而不是这样我决定使用MVC为您提供的HtmlHelpers,以便我可以提交此表单并将所有数据准确地放在我想要的位置,而不必构建WebApi控制器并捕获所有表单数据jQuery ...当这样做虽然插件的功能不起作用,这是因为我试图使用HtmlHelper Html.ListBoxFor这样

@Html.ListBoxFor(m => m.ResultAvailable, Model.AvailableDepartmentsSL, new { @name = "from[]", @id = "multiselect", @class = "form-control", @size = "8", @multiple = "multiple", @style = "min-width: 350px;margin-right:50px;" })

但是当我在开发工具中打开页面时,name属性未设置为“from []”,它被设置为“ResultAvailable”经过一些阅读后我发现我可以将name属性设置为“from [] “通过改变

@name = "from[]"

@Name = "from[]"

是的,它区分大小写!在此之后控制工作,但后来我遇到了创建这个问题的问题。帖子回来时带有空位...所以经过一些思考后我想到了男人,我想知道如果我只是注释掉了name属性会发生什么,这意味着控件不会像过去一样工作,并从那里点击提交。 ..令我惊讶的是,它奏效了。我是正确的MVC需要ListBox的名称不被更改,因为它给它做我想要它做的所需的名称...所以,自然现在插件不起作用,对吧? 错误!

有效。我不知道为什么......

我应该说我的解决方案让我感到不安......但它仍然是一个解决方案。谢谢你的帮助。