1

我正在使用一个MVC遗留代码的应用程序。到目前为止,我所做的更改是检索AccountDivisionModel对象列表的 2 次调用。原始代码调用存储过程并返回一个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)也没有显示,我可以看到它填充了所有部门的下拉列表。

我做错了什么?

下面是当前工作界面的图像。如您所见,框中显示的选定值和显示未选择的剩余项目的下拉列表。

当前工作界面的图像

4

2 回答 2

2

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

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

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

但是,我建议在您的模型中包含一个属性,该属性表示允许 2 路绑定的所选分区

模型

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

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

于 2014-11-12T06:44:25.647 回答
0

您不需要@所有 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)
于 2014-11-11T17:53:47.410 回答