2016-03-22 24 views
1

Gerçekten ASP.net MVC için yeni. Projemde 2 model var. Person.csmvc içinde veri sıralama

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; } 


    } 
} 

Ben de içeride bir Ayrıntılar ve Dizin görünümü ile 1 görüntüleme klasör var. Bunu, kontrolör altında yeni bir iskele öğesi ekleyerek ve Kişisel Model Modelime bağlayarak oluşturdum. Ayrıntılarım klasöründe, ortaya çıkan tarihlerin listesini sıralamaya çalışıyorum. Sıralama fonksiyonumdaki tarihleri ​​nasıl arayacağımı anlayamıyorum. Kişiler kontrolör Detaylar

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); 
} 

Detaylar sizin için Oturumlar gelen eğitim tarihlerini bir koleksiyon yaratacak

<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>
.Select (

+0

Bu nedenle, 'training' ile sıralanan '' '' '' '' '' '' 's' ile birlikte bir 'Person' almayı istersiniz, değil mi? –

+0

Kişilerimin içinde, kişiyle ilgili daha fazla ayrıntıyı listeleyen bir düğmeyi tıkladım. Bölgede isimlerini dinledim ve önceki eğitim oturumlarının bir listesini yaptım. Bu eğitim oturumlarının tarihe göre sıralanmasını istiyorum. Eğitim oturumları, Oturumlar modelinden geliyor, ancak nasıl yapılacağını anlayamıyorum. – netgen

cevap

1

Sen Person sınıfına id alan eksik gereken bu kodu

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); 
} 

deneyin. Ayrıca neden string id yerine int id kullanılmıyor? Session - public int ID { get; set; } numaralı telefon numaralarında id numaralı tamsayı var.

+0

Hatası \t Hatası '\t' System.Linq.IQueryable ',' System 'türünde bir ilk bağımsız değişken kabul eden' Find 've' extension 'uzantısı içermiyor. Linq.IQueryable 'bulunamadı (kullanma direktifini veya montaj referansını kaçırıyor musunuz?). – netgen

+0

@netgen projesinde bulunan System.Collections.Generic'i kullanıyorum. BT yerine 'FirstOrDefault' olmalıdır. Ayrıca 'Şahıs' üzerindeki 'ID 'alanınız nerede? –

+0

@netgen, 'rockets' gerçekten bir anahtar sütundur? –

0
case "date_desc": 
    persons = persons.OrderByDescending(s => s.Sessions.Select(t => t.training)); 
    break; 

) kodu görüntülemek .cs sipariş.

0

Sadece bu gerekir:

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

} 

oturumlarına göre bunları sipariş sonra tüm persons getirilirken ve herhangi bir neden yoktur. Mantıklı değil. İhtiyacınız olan tek şey sadece bir kişinin Seanslarını sipariş etmek.