Beste Möglichkeit zum Sortieren eine DropDownList in MVC3 / Razor-helper-Methode verwenden
Hallo also ich bin ziemlich neu bei MVC3 und Gestochen und ich habe versucht, meinen Kopf um ihn herum in den letzten paar Tagen. Ich habe eine Aufgabe von meinem Projekt-Architekt erstellen Sie eine helper-Methode sortiert ein drop-down-Liste in einer MVC-Ansicht. Ich habe ein View, das zum abrufen von verschiedenen Daten aus einem Controller und ich fahre einige Werte, die ich will erscheinen in einer drop-down-Liste. Ich habe nicht gesagt, die Art, die es in den Controller und auch die pass-Bereich, die wir Sortieren wollen, indem Sie in die helper-Methode. Ich könnte es tun, wie unten, aber der Architekt will den Blick frei von c-sharp-code:
@Html.DropDownListFor(model => model.StudyName, new SelectList(ViewBag.StudyTypes, "Value", "Text").OrderBy(l => l.Text))
So, ich habe einige Beispiel-code und einige Erweiterung Methoden zu versuchen und erhalten Sie zu arbeiten. Meine Idee ist es, zu replizieren, die bestehenden Html.DropDownList-Methode und ermöglichen die übergabe von 'Objekt htmlAttributes', so kann ich den Stil als Teil der Methode aufrufen.
Hier ist mein code bisher. Ich fahre die Daten für das Dropdown in der ViewBag.StudyTypes in den Edit-Controller-Methode:
public ActionResult Edit(int id)
{
IEnumerable<SelectListItem> mySelectList = new List<SelectListItem>();
IList<SelectListItem> myList = new List<SelectListItem>();
for (int i = 0; i < 5; i++)
{
myList.Add(new SelectListItem()
{ Value = i.ToString(), Text = "My Item " + i.ToString(), Selected = i == 2 }
);
}
mySelectList = myList;
ViewBag.StudyTypes = mySelectList;
StudyDefinition studydefinition = db.StudyDefinitions.Find(id);
return View(studydefinition);
}
Hier mein Anzeigen-code:
@model MyStudyWeb.Models.StudyDefinition
@using MyStudyWeb.Helpers
@{
ViewBag.Mode = "Edit";
}
<div>
@Html.DropDownListSorted(new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
@Html.DropDownListSorted("MyList", new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
</div>
Endlich unten sind die Verlängerung Methoden, die ich versuche, zur Arbeit zu kommen. Die erste Erweiterung Methode nichts tut, bekomme ich nur einen leeren Platz an diesem Punkt in der Ansicht. Die zweite Methode, die Art der arbeiten, aber es ist hässlich. Für die 3. Methode, ich weiß nicht, wie angeben, ein 'order by' - parameter wie die OrderBy-auf die eine IEnumerable-erwartet wird ein Linq-Ausdruck.
namespace StudyDefinition.Helpers
{
public static class HtmlHelperExtensions
{
//1st sort method: sort the passed in list and return a new sorted list
public static SelectList DropDownListSorted(this HtmlHelper helper, IEnumerable<SelectListItem> selectList)
{
var x = new SelectList(selectList.ToList()).OrderBy(l => l.Text);
return x as SelectList;
}
//2nd sort method: return IHtml string and create <select> list manually
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList)
{
StringBuilder output = new StringBuilder();
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
//3rd sort method: pass in order by parameter - how do I use this?
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList, string orderBy)
{
StringBuilder output = new StringBuilder();
//How do I use the orderBy parameter?
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
}
}
Weiß ich nicht wirklich der beste Ansatz zu nehmen, kann es eine viel einfachere Möglichkeit, dass ich völlig fehlen und ich vielleicht an dem Punkt, wo ich nicht sehen können, den Wald vor lauter Bäumen nicht mehr. Einige Fragen
-
Sollte ich wieder eine Auswahlliste oder eine MvcHtmlString, oder etwas ganz anderes?
-
Für die erste Erweiterung Methode, wie bekomme ich die zurückgegeben SelectList Rendern im Blick?
-
Wie ich einen parameter übergeben, um meine Erweiterung Methoden gibt die Sortierreihenfolge?
-
Wie gebe ich ein "Objekt htmlAttributes' parameter, und wie Wende ich dieses Objekt /parameter die Auswahlliste?
Wenn jemand noch Ideen oder Vorschläge, dann würde ich mich über ein feedback 🙂
InformationsquelleAutor Ciaran Bruen | 2011-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ersten und wichtigsten Teil des Codes wäre, um loszuwerden, alle
ViewBag/ViewData
(welche ich persönlich halte Krebs für MVC-Anwendungen) und über Ansicht-Modelle und stark typisierte sichten.Also beginnen wir mit der Definition einer view-Modell, das darstellen der Daten, die unsere Ansicht, arbeiten mit (a dropdownlistg in diesem Beispiel):
dann könnten wir einen controller:
sowie einen Blick:
und schließlich das Letzte Stück ist die helper-Methode, die zur Sortierung der dropdown-Wert (man könnte es anpassen um die Sortierung nach text):
Brün, OK für das bestehende system und ViewBag. Ich habe gerade erwähnt, ist es für die Zukunft code, um zu vermeiden, diese schlechte Praxis. Wenn Sie mehrere dropdownlists, müssen Sie einfach nur mehrere
IEnumerable<SelectListItem>
Eigenschaften Ihrer view-Modell. Über diereturn View(studydefinition)
, das ist der richtige Weg, um pass-view-Modelle zu sichten. Drittens, dieDropDownListFor
Erweiterungs-Methode definiert wird, in derSystem.Web.Mvc.Html
Namensraum, so fügen Sie einfach ein mit zu diesem namespace am Anfang der Datei mit derDropDownListForSorted
Helfer, um es in den Bereich.InformationsquelleAutor Darin Dimitrov
Nur in der Sortierung, bevor Sie die Einzelteile zurückbringen, um die dropdown-Liste.
Hierzu:
Modelle: StudyViewModel.cs
Controller: StudyController.cs
Ansicht: "Bearbeiten".cshtml
Diese Weise wird vermieden, ViewBags und nur eine Funktion verwenden, um füllen Sie die Werte direkt ein.
InformationsquelleAutor vapcguy
Wenn Sie mit einer Datenbank Sie können eine Abfrage verwenden, definieren die Art element
InformationsquelleAutor Pajoc