如何使用列表中最后一个特定项对@ Html.DropDownListFor进行排序

时间:2016-07-11 14:15:05

标签: html asp.net-mvc razor

我有一个包含选项的列表:

ATI

FICA

OTHER

FATCA

SOFP

我想修改订单,以便最后列出“其他”,这可能吗?

我的代码如下所示:

@Html.DropDownListFor(x => x.DocumentTypeId, Model.DocumentTypes, new { style = "width:174px", @title = "Document Type" })

我尝试过OrderBy,但这只是按字母顺序排列。

编辑:

文档类型多于我列出的文档类型,它们都是根据先前条件从数据库表中调用的。没有什么是硬编码的

4 个答案:

答案 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"})