我跟随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>
感谢您的帮助。
答案 0 :(得分:1)
这是由OrderBy(x => x)
子句引起的。 1}}匿名对象未实现,因此无法进行排序。
您应该使用IComparable
代替。
作为替代方案,您还可以为此简单对象创建一个类,使其实现OrderBy(x => x.StationName)
,同时选择适当的比较操作。
<强> 更新 强>
要定义一个替换匿名对象的类,请查看用于匿名对象的内容:IComparable
并编写一个完全模仿这些属性的类(我假设它们是new { StationID = ... , StationName = ... }
和{ {1}})。
然后我们通过在类名后面添加它来使类实现接口int
。然后编译器将强制我们实现方法string
,这是接口规定的唯一方法。对于实现,我只是选择比较一个看起来相关且有益于此目的的单个属性(StationName)。我们新的IComparable<...>
方法现在可以由Linq CompareTo(...)
子句使用。
CompareTo