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

Schreibe einen Kommentar