【问题标题】:Data sorting in mvcmvc中的数据排序
【发布时间】:2016-03-22 19:26:22
【问题描述】:

我对 ASP.net MVC 很陌生。在我的项目中,我有 2 个模型。 Person.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace CleryAct.Models
{
    public class Person
    {
        [Key]
        public string rockets { get; set; }
        public bool csa { get; set; }
        public string fname { get; set; }
        public string lname { get; set; }
        public string email { get; set; }

        public virtual ICollection<Session> Sessions { get; set; }
    }
}

Session.cs

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace CleryAct.Models
{
    public class Session
    {

        [Key]
        public int ID { get; set; }
        public string rockets { get; set; }
        public virtual Person Person { get; set; }
        public DateTime training { get; set; }


    }
}

我还有 1 个视图文件夹,里面有详细信息和索引视图。我通过在控制器下添加一个新的脚手架项目并将其链接到我的 Person Model 来创建它。在我的详细信息文件夹中,我尝试对出现的日期列表进行排序。我不知道如何在我的排序函数中调用日期。人员控制器详细信息.cs

public ActionResult Details(string id, string sortOrder)
{
    ViewBag.CurrentSort = sortOrder;
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Person person = db.Persons.Find(id);
    if (person == null)
    {
        return HttpNotFound();
    }
    var persons = from s in db.Persons select s;

    switch (sortOrder)
    {
        default:
            persons = persons.OrderBy(s => s.Sessions);
            break;
        case "date_desc":
            persons = persons.OrderByDescending(s => s.Sessions);
            break;
    }
    return View(person);
}

详情查看代码

<h2>Details</h2>

<div>
  <h4>Person</h4>
  <hr />
  <dl class="dl-horizontal">

    <dt>
            @Html.DisplayNameFor(model => model.lname), @Html.DisplayNameFor(model => model.fname) 
        </dt>

    <dd>
      @Html.DisplayFor(model => model.lname), @Html.DisplayFor(model => model.fname)
    </dd>

    <dt>
            @Html.DisplayNameFor(model => model.rockets)
        </dt>

    <dd>
      @Html.DisplayFor(model => model.rockets)
    </dd>

    <dt>
            @Html.DisplayNameFor(model => model.email)
        </dt>

    <dd>
      @Html.DisplayFor(model => model.email)
    </dd>
    <br />
    <br />
    <dt>
            @Html.DisplayNameFor(model => model.Sessions)
        </dt>
    <dd>
      <table class="table">
        @foreach (var item in Model.Sessions) {
        <tr>
          <td>
            @Html.DisplayFor(modelItem => item.training)
          </td>
        </tr>
        }
      </table>
    </dd>

  </dl>
</div>
<p>
  @Html.ActionLink("Edit", "Edit", new { id = Model.rockets }) | @Html.ActionLink("Back to List", "Index")
</p>

【问题讨论】:

  • 所以你想把PersonSessionstraining排序,对吧?
  • 在我的人员视图中,他们单击了一个按钮,其中列出了有关人员的更多详细信息。在该地区,我重新列出了他们的名字,并列出了他们之前的所有培训课程。我希望这些培训课程按日期排序。培训课程来自 Sessions 模型,但我不知道该怎么做。

标签: c# asp.net-mvc entity-framework sorting code-first


【解决方案1】:

试试这个代码

public ActionResult Details(string id, string sortOrder)
{
    // don't know what logic stands behind these ViewBag usages.
    // maybe you should get rid of them
    ViewBag.CurrentSort = sortOrder;
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    // changes start
    Person person = db.Persons.Include(x => x.Sessions).FirstOrDefault(p => p.rockets == id);
    if (person == null)
        return HttpNotFound();
    person.Sessions = sortOrder == "date_desc" ? 
        person.Sessions.OrderByDescending(s => s.training).ToList() : 
        person.Sessions.OrderBy(s => s.training).ToList();
    // changes end
    return View(person);
}

您必须在 Person 类上缺少 id 字段。另外,为什么不使用int id 而不是string id 呢? Session - public int ID { get; set; } 中有整数 id

【讨论】:

  • 查找出错 错误 3 'System.Linq.IQueryable' 不包含 'Find' 的定义并且没有扩展方法 'Find' 接受第一个参数可以找到类型“System.Linq.IQueryable”(您是否缺少 using 指令或程序集引用?)我确实有 using System.Collections.Generic 包含在项目中
  • @netgen,查看编辑。它应该是FirstOrDefaultPerson 上的 ID 字段在哪里?
  • @netgen,rockets 确实是关键列吗?
  • 成功了。火箭也应该是关键。我正在为一个系统构建它,该系统已经为每个人分配了一个唯一的“火箭号”。谢谢
【解决方案2】:
case "date_desc":
  persons = persons.OrderByDescending(s => s.Sessions.Select(t => t.training));
  break;

.Select() 将创建培训日期的集合,供您订购。

【讨论】:

    【解决方案3】:

    你只需要这个:

    switch (sortOrder)
    {
        case "date_desc":
            person.Sessions = person.Sessions
                                    .OrderByDescending(session => session.Training);
            break;
        default:
            person.Sessions = person.Sessions
                                    .OrderBy(session => session.Training);
            break;
    
    }
    

    没有任何理由获取所有persons,然后根据会话对其进行排序。这没有意义。您唯一需要的就是订购一个人的会话。

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多