【问题标题】:Selecting multiple from @Html.ListBoxFor从@Html.ListBoxFor 中选择多个
【发布时间】:2014-11-20 14:28:23
【问题描述】:

我添加了@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>

【问题讨论】:

  • model.Id是什么类型?
  • 实体@model So.Entities.FBApprovalFilter
  • 对不起,这对我来说没有多大意义。让我们更准确一点——如果属性Id 是什么类型?它是一些原语的列表,例如整数还是字符串?还是只是一个int?对于多项选择,您需要一个列表来接收所有选定的值
  • 好吧,假设用户选择了多个值。因此发布了多个整数。单个 int 字段如何容纳所有这些?

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


【解决方案1】:

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

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

它不包括ID 属性的绑定,因此它在回发时始终为空。当你使用[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" })

另外,这里的第三个参数

SelectList cityList = new SelectList(cities, "Id", "Name", cityId);

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

最后,在您的 POST 方法中,如果模型无效,您将返回视图。您需要重新分配 TempData["Cities"] 的值,否则在视图中这将是 null 并引发异常。

【讨论】:

    【解决方案2】:

    就像 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; }
    

    【讨论】:

    • 要带ViewModel吗?
    • 你的应该没问题,只是 model.Id 需要是 int[] 而不是 int
    • 我明白你的解释。我已经更改了下面的代码,仍然在提交时我得到空值 @Html.ListBoxFor(model => model.Ids, new SelectList(TempData["Cities"] as MultiSelectList, "Value","Text",new { style = "宽度:250px" })))
    • 是否可以为您的页面创建模型类?这是我注意到我们页面之间的唯一不同
    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2018-01-08
    • 2020-03-21
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多