Frage

Ich mag eine statische Liste von Elementen in einer SelectList() zu einem Html.DropDownList() in ASP.NET MVC zuweisen, was die beste Praxis ist?

Ich war im Begriff zu versuchen, einen Weg zu finden new SelectList(new {key = "value"}... zu verwenden, sondern eine, die nicht funktioniert hat, und zwei, würde ich hier ein Gesetz brechen, soll meine statische Liste in ViewData deklariert wird sowieso und übergab als IList/IENumerable

War es hilfreich?

Lösung 3

OK ich beschlossen, meine eigene Beratung zu nehmen, und dies sollte in der Steuerung definiert werden:

Zur Info, ich habe gerade zurückgegeben:

PageData data = new PageData()
           {
               Formats = new[]
                             {
                                 new { ID = "string", Name = "Text" },
                                 new { ID = "int", Name = "Numeric" },
                                 new { ID = "decimal", Name = "Decimal" },
                                 new { ID = "datetime", Name = "Date/Time" },
                                 new { ID = "timespan", Name = "Stopwatch" }
                             },
               .............

           };
return View(data);

... (ignorieren Kontext) und in der Ansicht ASPX Seite:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...

Wenn jemand eine optimalere Art und Weise, dies zu tun hat, werde ich glücklich sein, ihre Antwort zu akzeptieren.

Andere Tipps

Es ist eine bewährte Methode nicht die Select in der Ansicht zu erstellen. Sie sollten es in der Steuerung erstellen und übergeben sie das Bildschirmtextsystem verwendet wird.

Beispiel:

  var list = new SelectList(new []
                                          {
                                              new {ID="1",Name="name1"},
                                              new{ID="2",Name="name2"},
                                              new{ID="3",Name="name3"},
                                          },
                            "ID","Name",1);
            ViewData["list"]=list;
            return View();

übergeben Sie an den Konstruktor: das IEnumerable-Objekt, das Wertefeld des Textfeld und den ausgewählten Wert

.

in der Ansicht:

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>

Alle MVC noobs vermeiden zunächst das ‚M‘ Wort, aber es ist ein bisschen zu Beginn des MVC Akronym starten. Also vielleicht, nur vielleicht, möchten Sie vielleicht Ihre Lösung mit einem Modell starten ... nur sagen.

Do not Repeat Yourself (DRY). Du wirst den Kopiervorgang Ende und Einfügen der „neuen Pagedata ()“ zu jedem einzelnen Controller, um die Optionsliste auf einen Blick übergeht. Dann wirst du wollen eine Option löschen oder hinzufügen und müssen jedes Pagedata des Controllers bearbeiten.

Darüber hinaus mögen Sie die geringste Menge an Code geben mit dem wenigsten unnötig ausführlichen „add“ s, „neuer“ s, „IS“ s und „Name“ s. Da Sie nur einen Schlüssel-Wert-Paar in der Select-Option (und / oder eine Liste Optionsfeld), verwenden Sie die leichteste Datenstruktur möglich, das heißt ein Wörterbuch --in Ihr Modell.

Referenz Dann einfach das Modell im Controller und wandeln das Wörterbuch auf eine Select in der Ansicht mit einem DropDownListFor eine LINQ Lambda-Ausdruck enthält.

Eingeschüchtert? Du bist nicht allein. Ich war auf jeden Fall. Hier ist ein Beispiel habe ich mir die M zu lehren, die V und das C:

Das Modell Teil von MVC:

using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
   // This is pedagogical example of generating a select option display for a customer's egg preference.  

namespace EzPL8.Models     
{
    public class MyEggs    
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()  //constructor
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},  //show the complete egg menu to customers
                { 1, "I hate eggs"},    //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu

                //confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
                { 2, "Over Easy"},  
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };
    }
}

Der Controller ist nun ziemlich einfach, nur das Modell übergeben. Es vermeidet ein isoliertes Konzept zu schaffen, die wahrscheinlich nicht nur auf einer Seite isoliert.

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}

Der View verwendet DropDownListFor (anstelle von Dropdownlist) und ein Lambda-Ausdruck für starke Typisierung bei Refactoring ist erforderlich:

@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))

Voilà, das resultierende HTML:

<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>

Hinweis: nicht durch den Wert in <option value="6"> verwirren lassen, die der Schlüssel aus dem Wörterbuch, aus dem „Wert“ in der Select (), die der Text / Titel (zB Eier Benedict), die zwischen den Enden nach oben die Option Tags.

Use Case : Um den Datenverkehr zwischen der Anwendung zu minimieren und der Datenbank habe ich eine statische Liste eine Datenbankabfrage für die Dropdown-Liste zu vermeiden, die selten, wenn überhaupt ändert. Allerdings ist der Wandel unvermeidlich und sechs Monate ab jetzt ein Diner an meinem Kunden Restaurant stirbt; nicht wegen der grünen Schinken, sondern weil sie zu den Eiern und der Koch allergisch waren gemischt einige mit ihren Waffeln.

Das Restaurant braucht, um ihre Kunden-Info Nahrungsmittelallergien sind sofort aktualisiert. Während sie Stammkunden lieben, sind sie nicht cool mit toten Kunden zurück als Zombies kommen, die keine Möglichkeit haben, zu zahlen, weil ihre Kreditkarten wurden abgesagt.

Rhetorische Frage: Soll ich alle Controller ändern und Blick auf Kunden Ei Vorlieben zu tun? Oder legen Sie einfach {7, "Allergic to Eggs"} in das Modell?

Eine weitere Rhetorische Frage: Sind nicht Omelettes Eier? Haben Sie {8, „Omelette, Western“} hinzufügen möchten, {9, „Omelette, Pilz-Feta-Spinat“} einmal auf das Modell und haben die neuen Ergänzungen automatisch in allen Dropdown-Listen in allen Ansichten propagieren, die sie verwenden ?

Unterm Strich (n) Dies ist wahrscheinlich viel mehr, als Sie fragte ... aber Sie haben MVC sagen, nicht nur VC:
 1. Verwenden Sie ein Modell in * M * VC.  2. einen Wörterbuch im Modell verwenden, wenn eine Auswahlliste auf nichts anderes als einen „Primärschlüssel“ und einen Titel basiert.  3. Wenn Ihre statische Liste nicht mit einer Datenbank-Lookup-Tabelle irgendwo hat Jive, Ihre Anwendung ist wahrscheinlich nicht sehr nützlich. Wenn Sie eine Option auf eine statische Liste hinzufügen, mehr als wahrscheinlich, benötigen Sie auch einen Einsatz auf die Lookup-Tabelle durchzuführen mit anderen Tabellen in der Datenbank einen Primärschlüssel / Fremdschlüsselbeziehung Integritätsfehler zu vermeiden.  4. Verwenden Sie Lambda und stark typisierten Datenstrukturen, Fehler zu vermeiden und typeahead Unterstützung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top