2008-11-05 10 views
7

Ich brauche eine Dropdown-Liste auf meiner Seite, die es einem Benutzer ermöglicht, ihren Status auszuwählen. Da dies wahrscheinlich ein Steuerelement ist, das an anderer Stelle verwendet wird, dachte ich, es wäre eine gute Idee, ein MVC View-Benutzersteuerelement zu erstellen, das wiederverwendet werden kann.ASP.NET MVC View User Control - wie IDs zu setzen?

ich die Kontrolle dachte würde wie folgt aussehen:

<select name="" id=""> 
    <option value="AL">Alabama</option> 
    <option value="AK">Alaska</option> 
</select> 

Und den Code in meiner Sicht wäre so etwas wie:

<%= Html.RenderPartial("StateDropdownControl") %> 

Meine Frage ist, was ist der beste Weg zu setzen der Name und die ID auf dem Steuerelement? Ich möchte sicherstellen, dass ich bei Bedarf mehrere Instanzen dieses Steuerelements auf einer Seite haben kann. Außerdem möchte ich in der Lage sein, den Zustand zu senden, der standardmäßig ausgewählt werden sollte.

Würde ich es irgendwie mit ViewData machen?

Antwort

9

Corey ist auf der richtigen Lösung. Ich denke, das Erklären bestimmter Model-Objekte für Ihre Ansicht macht die Views SEHR einfach und als Seitenbonus macht es ihnen leicht, den Test zu testen.

Anstatt also nur die ID als Objekt übergeben, dann würden Sie wahrscheinlich wollen Ihr eigenes Modell-Objekt erstellen, um passieren

es so etwas wie folgt aussehen könnte:.

Offensichtlich
public class StateDropDownPresentationModel 
{ 
    public string DropDownID { get; set; } 
    public string SelectedState { get; set; } 
} 

, fügen Sie alles hinzu, was Sie für dieses Modell benötigen, damit Ihre Ansicht korrekt ist.

Dann könnte man es so nennen:

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", new StateDropDownPresentationModel { DropDownID = "MyID", SelectedState = "IL" } %> 

Dann einfach sicher, dass Sie bei den Kontrollen für Dinge wie ID gesetzt ist null/leer (das sollte wohl einen Fehler aus) und SelectedState null sein/blank .

3

Nun können Sie Objektdaten an die RenderPartial Verfahren in Verbindung mit dem User Control zu machen passieren, so dass Sie leicht die folgende tun könnte:

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", "MyID") %> 

und in dem Usercontrol haben die folgende :

<select name="<%=ViewData.Model%>" id="<%=ViewData.Model%>"> 

.... 

Nur um sicher zu sein, ein besserer Weg, es zu handhaben ist, ein einfache DTO (Datentransfer-Objekt) zu machen, dass infor zu halten Damit können Sie mehr Informationen an Ihre Benutzersteuerung weitergeben, die Sie unweigerlich benötigen.

Beispiel:


class ComboData 
{ 
    string ID {get;set;} 
    string CssClass {get;set;} 
    //Other stuff here 
} 

<% 
var comboData = new ComboData {ID = "myID", CssClass = "comboStyle" } 

%> 

<%= Html.RenderPartial("/someDirectory/SomeControl.ascx", comboData) %> 
<select name="<%=ViewData.Model.ID%>" id="<%=ViewData.Model.ID%>" class="<%=ViewData.Model.CssClass%>"> 

.... 

Stellen Sie sicher, den Code hinter der Benutzersteuerung setzen ein generischer Typ ComboData für dieses Beispiel zu sein.

1

Werfen Sie einen Blick auf die Hilfsmethode Html.DropDownList. Es verfügt über eine Reihe von Überladungen, mit denen Sie die Listendaten übergeben und das ausgewählte Element festlegen können. Die einfachste Version legt nur den Namen der Auswahl fest.

<%= Html.DropDownList("SelectStates"); %> 

Wenn es ein Wert in der Viewdata ist [ „SelectStates“], die vom Typ MultiSelectList ist, dann wird die Liste automatisch aufgefüllt werden.