在Razor View中使用ListBox的ASP.net MVC MultiSelectList

时间:2017-01-10 17:50:00

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

我跟随blog在我的应用中使用ASP.Net MVC MultiSelectList。我遇到了

  

“System.ArgumentException:至少有一个对象必须实现IComparable。”错误。

我正在使用ASP.Net MVC 5.2.3。我的控制器有一个动作填充MultiSelectList并将其分配给ViewBag.stations变量,如下所示:

var qryResult = DB.getPatientInfoCompleted(StationIDs);            
var theseStations = qryResult.Select(x => new
{
    StationID = x.StationID,
    StationName = x.StationName
}).Distinct().OrderBy(x => x);
ViewBag.station = new MultiSelectList(theseStations, "StationID", "StationName");

剃须刀视图

<td>
    @Html.DropDownList("station2", (MultiSelectList)ViewBag.stations, new { multiple = "multiple"})
</td>

<td>
    @Html.ListBox("station", (MultiSelectList)ViewBag.stations, new { @id = "lstMultiSelect", @class = "btn btn-default btn-sm dropdown-toggle menu-width" })
</td>

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是由OrderBy(x => x)子句引起的。

您应该使用IComparable代替。

作为替代方案,您还可以为此简单对象创建一个类,使其实现OrderBy(x => x.StationName),同时选择适当的比较操作。

<强> 更新

要定义一个替换匿名对象的类,请查看用于匿名对象的内容:IComparable并编写一个完全模仿这些属性的类(我假设它们是new { StationID = ... , StationName = ... }和{ {1}})。

然后我们通过在类名后面添加它来使类实现接口int。然后编译器将强制我们实现方法string,这是接口规定的唯一方法。对于实现,我只是选择比较一个看起来相关且有益于此目的的单个属性(StationName)。我们新的IComparable<...>方法现在可以由Linq CompareTo(...)子句使用。

CompareTo