2017-01-19 6 views
0

Ich bin nach dem Erstellen einer wirklich einfachen Dropdown-Liste, die im Wesentlichen verschiedene Zeiten zeigt, und ihr Wert ist die Minuten nach Mitternacht für jedes Mal. Zum Beispiel:Wie erstelle ich eine wiederverwendbare Dropdown-Liste

Value  Time 
60   01:00 AM 
75   01:15 PM 
90   01:30 PM 
105   01:45 PM 
120   02:00 PM 

etc

Die Sache ist, ich brauche die gleiche Dropdown-Liste in einer ganzen Reihe von Ansichten und Controller in meiner Anwendung verwenden. Nachdem ich ein paar Artikel gelesen habe, scheint es, als müsste ich eine statische Klasse dafür erstellen? Aber alle Beispiele scheinen viel komplizierter zu sein, als ich eigentlich brauche. Ist es ein IList, dass ich dafür erstellen sollte?

+0

in Schritt erzeugt werden, die Sie in Ihrer mvc Implementierung jede IoC verwenden? – Fran

Antwort

1

Sie könnten versuchen, die folgende Methode

  1. eine statische Klasse erstellen, die Daten erzeugen Quelle für das Dropdown
public static class DropdownData 
{ 
    public static IList<SelectListItem> GetTimeList(string defaultValue) 
    { 
     var times = new List<SelectListItem>(); 
     times = Enumerable.Range(4, 4).Select(x => { 
      var minute = x * 15; 
      var time = DateTime.Today.AddMinutes(minute); 
      return new SelectListItem() 
      { 
       Value = minute.ToString(), 
       Text = time.ToString("hh:mm tt"), 
       Selected = (!string.IsNullOrEmpty(defaultValue) && minute.Equal(defaultValue)) 
      }; 
     }).ToList(); 
     return times; 
    } 
} 
  1. In Ihren Ansichten, Sie Drop-Down-Liste mit Datenquelle erstellen konnten, die 1
@Html.DropDownList("TimeList", DropdownData.GetTimeList("75"), new { @class = "form-control" }) 
+0

Das funktioniert perfekt! Wie ändere ich, um alle 15 Minuten in 24 Stunden aufzulisten? Ändern Sie einfach die Reichweite? – Gavin5511

+1

Sie könnten zu Enumerable.Range (** 1, 96 **) wechseln (24 Stunden = 96 mal 15 Minuten) –

+0

Danke @Trung. Ich glaube nicht, dass Sie wissen, wie ich mit diesem Ansatz einen Standardwert auswählen kann. Ist es möglich? Sollte ich den Standardwert in der Ansicht oder im Aufbau der Liste auswählen? – Gavin5511

0

Wenn Sie einen Wert von Global benötigen, dann möchten Sie, dass es in C# public static ist. Ich empfehle auch, es in eine public static class zu setzen, so dass Sie mit Namen darauf zugreifen können.

public static class MyData 
{ 
    public static IEnumerable<DateTime> ValueTimes { get; set;} //(or IList or List<T> or whatever you want)  
} 

public class IDoStuff 
{ 
    public DateTime myTime { get; set; } 
    public IDoStuff(DateTime d) //constructor 
    { 
    if(ValueTimes.IndexOf(d) != -1) //-1 says I no findie 
     myTime = d; 
    else 
     throw new ApplicationException("That's not a valid time, dummy"); 
    } 
} 

Siehe, einfach peasy. Verwenden Sie auch DateTime oder TimeSpan, auch wenn es am selben Tag ist. Verwenden Sie nicht strings, um Zeit darzustellen, Sie bitten um Probleme auf diese Weise.

Bearbeiten: Während ich die Lösung aufstellte, haben Sie Beispieldaten gepostet. Vor diesem Hintergrund:

Value  Time 
60   01:00 AM 
75   01:15 PM 
90   01:30 PM 
105   01:45 PM 
120   02:00 PM 

Ich denke, man kann eigentlich nur das tun und die statische Variable Überspringen:

public static Timespan GetTime(int value) 
{ 
    return Timespan.FromMinutes(value); 

} 
+0

Eine andere Option wäre, dies zu einer Basis-Controller-Klasse hinzuzufügen und alle Controller von dieser Basisklasse zu erben oder einen Cache oder eine andere mittlere Ebene zu verwenden, um diese zu speichern (wie HttpCache oder Redis). Dies vermeidet die Verwendung von statischen Variablen im Web-Code, die mich schmutzig machen :) – Milney

Verwandte Themen