MVC5 Razor 视图 String.Join 每次迭代时反转顺序

MVC5 Razor view String.Join reversing order on each iteration

我在我的控制器中使用以下 LINQ 语句在 ASP.NET MVC5 项目中填充我的视图模型,使用 List<string> 来保存地址行,以便可以将它们连接起来我的观点。

var model = db.School
              .Where(s => s.IsClosed == false)
              .OrderBy(s => s.Name)
              .Select(s => new SchoolIndex
              {
                  SchoolCode = s.Code,
                  School = s.Name,
                  LocalAuthority = s.LocalAuthority,
                  IsClosed = s.lIsClosed,
                  AddressLines = new List<string>() {
                        s.Address1,
                        s.Address2,
                        s.Address3,
                        s.Address4,
                        s.Address5,
                        s.Postcode
                  }
              }).ToPagedList(Page, 50);

在我看来,我正在使用 String.Join 将地址行连接到 table 单元格中的一行,同时使用 LINQ 查询删除任何空地址行或空白地址行。

<tbody>
    @foreach (var school in Model)
    {
        <tr>
            <td>@Html.DisplayFor(s => school.SchoolCode)</td>
            <td>
                @Html.DisplayFor(s => school.School)
                <div class="school-address">
                    @String.Join(",", school.AddressLines
                                            .Where(s => !String.IsNullOrEmpty(s)))
                </div>
            </td>
            <td>@Html.DisplayFor(s => school.LocalAuthority)</td>
            <td>@Html.DisplayFor(s => school.IsClosed)</td>
        </tr>
    }
</tbody>

但是,我的结果没有按预期显示,我得到的结果类似于:

Address1, Address2, Address3, Address4, Address5, Postcode
Postcode, Address5, Address4, Address3, Address2, Address1
Address1, Address2, Address3, Address4, Address5, Postcode
Postcode, Address5, Address4, Address3, Address2, Address1
Address1, Address2, Address3, Address4, Address5, Postcode
Postcode, Address5, Address4, Address3, Address2, Address1

预期结果是:

Address1, Address2, Address3, Address4, Address5, Postcode
Address1, Address2, Address3, Address4, Address5, Postcode
Address1, Address2, Address3, Address4, Address5, Postcode
Address1, Address2, Address3, Address4, Address5, Postcode
Address1, Address2, Address3, Address4, Address5, Postcode
Address1, Address2, Address3, Address4, Address5, Postcode

我该如何解决这个问题才能正确显示所有地址?我猜我需要使用 List<string>Index 值来指定 OrderBy,尽管我不确定语法。

更新: 在调试创建模型的控制器时,我的视图模型中的 List<string> 没有按照指定的顺序填充,有时它是正确的,尽管它看起来是随机的。

可能 EF select 不会保存您尝试实现的顺序。试试这个解决方法:

// change AddressLines definition to such:
public class AddressLines 
{
     // your other properties
     // ..
     public string Address1 {get;set;}
     public string Address2 {get;set;}
     public string Address3 {get;set;}
     public string Address4 {get;set;}
     public string Address5 {get;set;}
     public string PostCode{get;set;}

     public IEnumerable<String> AddressLines
     {
         get 
         {
             return new [] {
                    this.Address1,
                    this.Address2,
                    this.Address3,
                    this.Address4,
                    this.Address5,
                    this.Postcode
              };
         }
     }
} 

然后修改select:

   var model = db.School
          .Where(s => s.IsClosed == false)
          .OrderBy(s => s.Name)
          .Select(s => new SchoolIndex
          {
              SchoolCode = s.Code,
              School = s.Name,
              LocalAuthority = s.LocalAuthority,
              IsClosed = s.lIsClosed,
              Address1 = s.Address1,
              Address2 = s.Address2,
              Address3 = s.Address3,
              Address4 = s.Address4,
              Address5 = s.Address5,
              Postcode = s.Postcode
              }
          }).ToPagedList(Page, 50);

这样 AddressLines 集合将在实际 select 之后形成,并且应该有正确的顺序。