从@ Html.ListBoxFor中选择多个

时间:2014-11-20 14:28:23

标签: asp.net-mvc asp.net-mvc-4

我添加了@ Html.ListBoxFor我能够正确绑定它但在提交后无法获取多个选定的项目。我错过了什么吗?

  // Below is the code for binding

  public ActionResult Create()
    {
        var cities = So.BL.City.GetCities();

        SelectList cityList = new SelectList(cities, "Id", "Name", cityId);
        TempData["Cities"] = cityList;

        return View("Create");
    }


 [HttpPost]
    public ActionResult Create([Bind(Include="Keywords,Cities")] So.Entities.Approval filter)
    {
        if (ModelState.IsValid)
        {


        }
        return View(filter);
    }

以下是视图文件代码。我没有视图模型只是实体

 @using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)


<table style="width: 100%">
    <tr>
        <td>
            Cities:
        </td>
    </tr>
    <tr>
       @* <td>
              @Html.DropDownList("Cities", (SelectList)TempData["Cities"])    
        </td>*@
    </tr>
    <tr>
        <td>
            @Html.ListBoxFor(model => model.Id, new SelectList(TempData["Cities"] as MultiSelectList, "Value","Text",new { style = "width:250px" })))


        </td>
    </tr>
    <tr>
        <td>
            @Html.LabelFor(model => model.Keywords)
        </td>
    </tr>
    <tr>
        <td>
            @Html.EditorFor(model => model.Keywords)

        </td>
    </tr>
    <tr>
        <td>

        </td>
    </tr>

    <tr>
        <td>
            <input type="submit" value="Create" class="button" />
        </td>
    </tr>
</table>

2 个答案:

答案 0 :(得分:1)

假设您已根据评论将ID属性更改为typeof int[],您仍然遇到问题,主要问题是您的POST方法有

 [Bind(Include="Keywords,Cities")]

排除了ID属性的绑定,因此在回发时它将始终为null。当您使用[Bind]属性时,您应该重新考虑您在做什么,并使用视图模型来显示/编辑您想要的属性,包括SelectList的属性。

@Html.ListBoxFor()方法中也有一些无意义的代码。 TempData["Cities"]已经是SelectList,因此new SelectList(TempData["Cities"] as MultiSelectList, "Value","Text"正在将SelectList转换为MultiSelectList,然后创建新的SelectList表单。你所需要的只是

@Html.ListBoxFor(model => model.ID, (SelectList)TempData["Cities"], new { style = "width:250px" })

另外,这个

中的第3个参数
SelectList cityList = new SelectList(cities, "Id", "Name", cityId);

不是必需的(不确定您声明cityId的位置,因为实际上,您的代码无法编译)。 ListBoxFor()方法根据ID属性的值选择选项,并忽略selectedValue构造函数中的SelectList参数。

最后,在POST方法中,如果模型无效,则返回视图。您需要重新分配TempData["Cities"]的值,或者在视图中为null并抛出异常。

答案 1 :(得分:0)

与Andrei建议的一样,您需要将所选值绑定到数组类型。

前端:

    <div class="DualListBoxDIV">
        @Html.ListBoxFor(model => model.RelatedNewsArticlesSelected, new MultiSelectList(Model.AssignedRelatedNewsArticles, "Value", "Text", Model.RelatedNewsArticlesSelected), new { @class = "SelectedBox", Size = 10 })
    </div>

后端:

    public string[] RelatedNewsArticlesSelected { get; set; }
    public IEnumerable<SelectListItem> AssignedRelatedNewsArticles { get; set; }
    public IEnumerable<SelectListItem> UnassignedRelatedNewsArticles { get; set; }