【问题标题】:Unable to display MultiSelectList.SelectedValues on MVC view无法在 MVC 视图上显示 MultiSelectList.SelectedValues
【发布时间】:2014-11-12 14:44:25
【问题描述】:

我正在使用作为遗留代码的MVC 应用程序。到目前为止,我所做的更改是两次调用以检索AccountDivisionModel 对象的列表。原始代码调用存储过程并返回一个ObjectResult,其中包含数据。

public class AccountDivisionModel
{
    int DivisionID;
    string DivisionName;
    int AccountID;
    bool IsActive;
}

我正在进行 2 次调用,以检索属于某个客户的部门列表和属于该客户联系人的(选定的)部门列表。

var aDivs = Account.GetDivisionByAccountID(c.AccountID).ToArray();
var cDivs = Contact.GetDivisionByContactID(c.ContactID).ToArray();
ViewBag.AccountDivisions = new MultiSelectList(aDivs, "DivisionID", "DivisionName", cDivs);

在我的编辑视图中

@Html.DropDownList("AccountDivisions", null, htmlAttributes: new { @class = "form-control", @multiple = "multiple", @placeholder = "Select Division(s)" })

我不知道为什么 SelectedValues 没有显示,即使当我单击文本框 (@placeholder) 时,我可以看到它填充了所有分区的下拉列表。

我做错了什么?

下面是当前工作界面的图片。如您所见,框中显示的 Selected Values 和下拉列表中显示了剩余的未被选中的项。

【问题讨论】:

  • 您的意思是您希望看到基于某些值在列表中预先选择的某些选项?
  • 是的。每当我来到这个页面时,我都会看到我之前添加到联系人中的部门。我可以从下拉列表中添加更多部门或删除预先选择的部门。
  • 您用于创建MultiSelectList 的重载接受选定值的集合。由于您使用属性DivisionID 作为选项值(我假设这是int),所以最后一个参数应该是IEnumerable<int>,其中包含您要选择的值。但是您确实应该考虑使用具有int[] SelectedDivisions 之类的属性的视图模型,并使用@Html.ListBoxFor(m => m.SelectedDivisions, Model.AccountDivisions)` 绑定到它,这样您就可以立即获得所有正确的行为。
  • 就是这样,斯蒂芬。 cDivs 需要是 List,而不是(DivisionID 和 DivisionNames)的集合。感谢您的帮助。

标签: asp.net-mvc bootstrap-multiselect


【解决方案1】:

MultiSelectList 的第四个参数需要与第二个参数的类型匹配的选定值的集合(通常是intstring)。目前,您正在向它传递一个复杂对象的集合,因此它与任何选项值都不匹配。你可以通过改变来解决这个问题

var cDivs = Contact.GetDivisionByContactID(c.ContactID).ToArray();

var cDivs = Contact.GetDivisionByContactID(c.ContactID).Select(c => c.DivisionIDs);

不过,我建议在模型中包含一个属性,该属性表示允许双向绑定的选定分区

型号

public IEnumerable<int> SelectedDivisions { get; set; }

控制器

model.SelectedDivisions = Contact.GetDivisionByContactID(c.ContactID).Select(c => c.DivisionID);
ViewBag.AccountDivisions = new MultiSelectList(aDivs, "DivisionID", "DivisionName"); // 4th parameter not required

查看

@Html.ListBoxFor(m => m.SelectedDivisions, (MultiSelectList)ViewBag.AccountDivisions, new { @class = "form-control"}) // ListBoxFor adds multiple attribute

然后模型包含回发时选择的值。

【讨论】:

    【解决方案2】:

    你不需要 @ 用于所有 HTML 属性,你只需要它用于 class ,因为这是 c# 中的保留字

    @Html.DropDownList("AccountDivisions", null, htmlAttributes: new 
           { @class = "form-control", multiple = "multiple", placeholder = "Select Division(s)" })
    

    您可能做错了,DropDown 的典型用途是让用户从一堆选项中选择一个选项。所以通常一个模型会有 2 个属性,比如:

    List<SelectItems> Accounts
    int SelectedAccount
    

    那么..你会做的

    @Html.DropDownListFor( x => x.SelectedAccount, (SelectList)x.Accounts)
    

    【讨论】:

    • 我没有改变任何观点。我只更改了控制器级别的代码,所以我怀疑我在那里做错了什么。我已经在上面包含了当前工作界面的图像。我相信在视图中也使用了引导程序,如果这增加了任何说明的话。
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多