Wie Sortiere ich eine Liste von Entitäten mit ViewModel statt ViewBag?
Ich bin mit ViewBag zu helfen, mich zu Sortieren, eine Liste von Schülern gefunden, die eine Liste von Klassen. Ich habe gelesen, dass ViewBag ist etwas, das vermieden werden sollte unter allen Umständen versuchen, zu bauen, ein richtiges MVC-Projekt.
Beim anzeigen der Seite, die den code unten erzeugt, ist man in der Lage, zu Sortieren, eine Liste von Studenten in einer Vielzahl von Möglichkeiten (Vorname von alpha -, Nachname von alpha, Datum eingeschrieben, etc), und zeigen nur eine begrenzte Anzahl von Studierenden pro Seite.
Ich weiß nicht genau, wie das zu übersetzen, meinen code zu verwenden, eine ViewModel an Stelle von meinen aktuellen design.
Ich bin mit dem folgenden code:
Modell (Student):
public class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public string Email { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
Modells (Einschreibung):
public class Enrollment
{
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public string Grade { get; set; } //pass, fail, incomplete
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
(Ich habe auch einen Kurs-Modell, aber es ist nicht direkt verwiesen, indem Sie den regler unten, also werde ich es weglassen, wenn es notwendig ist, zu zeigen, dass die details, bitte lassen Sie mich wissen).
Controller:
public class StudentController : Controller
{
private SchoolContext db = new SchoolContext();
//
//GET: /Student/
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date desc" : "Date";
ViewBag.FNameSortParm = sortOrder == "FName" ? "FName desc" : "FName";
ViewBag.EmailSortParm = sortOrder == "Email" ? "Email desc" : "Email";
if (Request.HttpMethod == "GET")
{
searchString = currentFilter;
}
else
{
page = 1;
}
ViewBag.CurrentFilter = searchString;
var students = from s in db.Students
select s;
if (!String.IsNullOrEmpty(searchString))
{
students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
|| s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
}
switch (sortOrder)
{
case "Name desc":
students = students.OrderByDescending(s => s.LastName);
break;
case "Date":
students = students.OrderBy(s => s.EnrollmentDate);
break;
case "Date desc":
students = students.OrderByDescending(s => s.EnrollmentDate);
break;
case "FName":
students = students.OrderBy(s => s.FirstMidName);
break;
case "FName desc":
students = students.OrderByDescending(s => s.FirstMidName);
break;
case "Email":
students = students.OrderBy(s => s.Email);
break;
case "Email desc":
students = students.OrderByDescending(s => s.Email);
break;
default:
students = students.OrderBy(s => s.LastName);
break;
}
int pageSize = 4;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));
}
Und meine Ansicht:
@model PagedList.IPagedList<MVCAppName.Models.Student>
@{
ViewBag.Title = "Students";
}
<h2>Students</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm())
{
<p>
Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" /></p>
}
<table>
<tr>
<th></th>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("First Name", "Index", new { sortOrder = ViewBag.FNameSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Email", "Index", new { sortOrder = ViewBag.EmailSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
@Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
</tr>
}
</table>
<div>
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount
@if (Model.HasPreviousPage)
{
@Html.ActionLink("<<", "Index", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
}
else
{
@:<<
@Html.Raw(" ");
@:< Prev
}
@if (Model.HasNextPage)
{
@Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink(">>", "Index", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
}
else
{
@:Next >
@Html.Raw(" ")
@:>>
}
</div>
meine Tiraden auf viewbag: completedevelopment.blogspot.com/2011/12/...
Heißt das, dass, wenn es compile-Zeit überprüft es würde keine negativen stigma verbunden mit ViewBag?
InformationsquelleAutor Ecnalyr | 2012-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte der controller Griff die Sortierung, die Ansicht zeigt nur die Daten. Sie das schon tun, so müssen Sie nur definieren view-Modell, das preivosuly Sie würde in der ViewBag
Dann in der Ansicht
Die Sortierung wird in der Regel durchgeführt, indem das Modell (unabhängig von der ViewModel), aber der Controller entscheidet, welches Modell soll verwendet werden. Das meinte ich mit "der controller sollte in der Lage, die Sortierung'. Die Ansicht zeigt nur die Daten, die ofc-Sie Sortieren können es aber nur die Daten, die durch den Controller.
wenn ich wollte, um interaktive Sortierung Fähigkeit, wäre es nicht einfacher zum ändern der Sortierung in der Ansicht, anstatt ein neues Modell erstellen? Ich Frage nur, da bin ich ein n00b. 🙂
Es gibt keine Notwendigkeit für ein neues Modell. Und durch die interaktive Sortierung ich denke du meinst javascript auf der client-Seite, aber selbst dann könnten Sie senden eine Anforderung an den controller zurückgibt (als json), die Ergebnis-Seite. Die Ansicht ist dort nur zum Rendern der View-Modell und Sortieren nur das ViewModel.
ahh, das macht jetzt Sinn. Danke!
InformationsquelleAutor MikeSW
Ich denke, das schönste wäre Unterklasse der
PagedList.IPagedList<T>
die Sie verwenden, und fügen Sie die Sortierreihenfolge gibt. So am Ende des Controllers hätten Sie diese:Aber wenn Sie nicht bereit, das zu tun, dann könnte man einfach eine neue ViewModel-Klasse zu halten, die PagedList (dem aktuellen Modell) sowie die zusätzlichen Daten, die Sie benötigen (D. H. die Sortierreihenfolge).
Mit der SortedStudents die wie folgt definiert sind:
InformationsquelleAutor Clafou
Könnte man ein wrapper um Ihre Schüler Klasse
In Ihrem controller, erstellen Sie eine neue StudentWrapper
und legen Sie die Liste der Schüler:
und die sortOrder
Übergeben Sie dieses Modell, um Ihre Ansicht
in Ihrer Ansicht, die Sie verwenden würden, die StudentWrapper
Ich weiß nicht, wie Ihr das paging funktioniert, so müsste man, um dies herauszufinden.
Aber ich dont sehen irgendwelche Probleme bei der Verwendung der ViewBag.
InformationsquelleAutor Kenci