我有一个包含选项的列表:
ATI
FICA
OTHER
FATCA
SOFP
我想修改订单,以便最后列出“其他”,这可能吗?
我的代码如下所示:
@Html.DropDownListFor(x => x.DocumentTypeId, Model.DocumentTypes, new { style = "width:174px", @title = "Document Type" })
我尝试过OrderBy,但这只是按字母顺序排列。
编辑:
文档类型多于我列出的文档类型,它们都是根据先前条件从数据库表中调用的。没有什么是硬编码的
答案 0 :(得分:1)
您必须实现自己的DropDownListFor自定义实现。
您可以从here (stackoverflow)开始查看一些示例。
答案 1 :(得分:1)
最简单的解决方案是在服务器端使用您的4个选项创建一个排序列表,然后只需添加其他作为列表中的最后一项。然后,将数据传递给已准备好的模型,让视图正常呈现html。
答案 2 :(得分:1)
订购您的元素
您可以考虑通过OrderBy()
方法调用基于该特定元素对其进行排序,这会将“ORDER”元素放在列表的末尾:
<!-- This will maintain your order, except place "ORDER" at the end of the list -->
@Html.DropDownListFor(x => x.DocumentTypeId, Model.DocumentTypes.OrderBy(d => d == "ORDER"), ... )
你可以see an example of this in action here。
其他注意事项
通常,您应该避免直接在视图中包含此类逻辑。在将模型传递给View之前,最好在模型中处理它(通过明确设置要使用的值的顺序,或者执行类似于上面提到的OrderBy()
调用) :
// Order prior to passing to the View
Model.DocumentTypes = Model.DocumentTypes.OrderBy(d => d == "ORDER").ToList();
return View(Model);
答案 3 :(得分:1)
在我需要这样的任务的项目中,我创建了一个单独的c#文件并创建了一个类似的方法:
public static List<SelectListItem> lstOptionsInOrder()
{
List<SelectListItem> lstOptions = new List<SelectListItem>();
List<string> lstOptionsOrder = new List<string>() {"ATI", "FICA", "FATCA", "SOFP", "OTHER"};
var optionsInOrder = db.DocumentTableName.OrderBy(x => lstOptionsOrder.IndexOf(x.DocumentTypes));
foreach(var option in optionsInOrder){
SelectListItem item = new SelectListItem() {Text = option.DocumentTypes, Value = option.ID.ToString()};
lstOptions.Add(item);
}
return lstOptions;
}
然后在你的控制器中:
ViewBag.lstOrderOptions = /*NameOfC#File*/.lstOptionsInOrder();
然后在你的视图中:
@Html.DropDownList("lstOrderOptions", null, "-- Select Option --", htmlAttributes: new { @class = "form-control"})