【问题标题】:How to sort @Html.DropDownListFor with a specific item last on the list如何使用列表中最后一个特定项目对@Html.DropDownListFor 进行排序
【发布时间】:2016-07-11 22:42:07
【问题描述】:

我有一个选项列表:

ATI

菲卡

其他

FATCA

SOFP

我想修改顺序,最后列出“其他”,这可能吗?

我的代码如下所示:

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

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

编辑:

文档类型比我列出的几个还要多,它们都是从数据库表中调用的,具体取决于先前的条件。没有什么是硬编码的

【问题讨论】:

  • 你为什么不最后用 jquery 添加另一个选项。那将是最简单的解决方案

标签: html asp.net-mvc razor


【解决方案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

其他注意事项

通常,您应该避免将这种类型的逻辑直接合并到您的视图中。在将它传递给视图之前,最好在模型本身中处理它(通过显式设置要使用的值的顺序,或者执行类似于上面提到的 OrderBy() 调用):

// Order prior to passing to the View
Model.DocumentTypes = Model.DocumentTypes.OrderBy(d => d == "ORDER").ToList();
return View(Model);

【讨论】:

    【解决方案2】:

    您必须实现自己的 DropDownListFor 自定义实现。

    您可以开始查看 here (stackoverflow) 以获取一些示例。

    【讨论】:

      【解决方案3】:

      最简单的解决方案是使用您的 4 个选项在服务器端创建一个排序列表,然后简单地将“其他”添加为列表中的最后一项。然后将数据传递给已经准备好的模型,让视图正常呈现 html。

      【讨论】:

      • 谢谢,我找到了列表的填充位置,在列表完全填充后删除了该项目,然后再次添加它,将其放在列表的最后。
      【解决方案4】:

      在需要此类任务的项目中,我创建了一个单独的 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"})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多