2008-11-05 9 views
7

J'ai besoin d'une liste déroulante sur ma page qui permettra à un utilisateur de sélectionner son état. Comme il s'agit probablement d'un contrôle qui sera utilisé ailleurs, j'ai pensé que ce serait une bonne idée de créer un contrôle d'utilisateur MVC View qui pourrait être réutilisé.ASP.NET MVC View User Control - comment définir les ID?

Je pensais le contrôle ressemblerait à quelque chose comme ceci:

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

Et le code à mon avis serait quelque chose comme:

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

Ma question est, quelle est la meilleure façon de mettre le nom et l'id sur le contrôle? Je voudrais m'assurer que je pourrais avoir plusieurs instances de ce contrôle sur une page, si nécessaire. Aussi, je voudrais pouvoir envoyer l'état qui devrait être sélectionné par défaut.

Est-ce que je pourrais le faire avec ViewData?

Répondre

9

Corey est sur la bonne solution. Je pense que déclarer des objets Modèle spécifiques pour votre vue rend les vues TRÈS simples et comme un bonus de côté rend la saleté facile à tester.

Ainsi, au lieu de simplement passer l'ID de l'objet, vous auriez probablement envie de créer votre propre objet de modèle pour passer

Il pourrait ressembler à ceci:.

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

De toute évidence, continuez d'ajouter tout ce dont vous avez besoin à ce modèle pour que votre vue soit correcte.

Ensuite, vous pouvez l'appeler comme ceci:

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

Ensuite, assurez-vous de mettre des contrôles pour des choses comme ID étant nul/blanc (qui devrait probablement lancer une erreur) et SelectedState étant nul/blanc .

3

Eh bien, vous pouvez transmettre des données d'objet à la méthode RenderPartial conjointement au contrôle de l'utilisateur de rendre, de sorte que vous pouvez facilement effectuer les opérations suivantes:

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

et dans le UserControl, procédez comme suit :

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

.... 

Juste pour être sûr, une meilleure façon de le gérer est de faire un simple DTO (objet de transfert de données) pour tenir qu'Infor mation afin que vous puissiez transmettre plus d'informations à votre contrôle utilisateur, dont vous aurez inévitablement besoin.

Exemple:


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%>"> 

.... 

Assurez-vous de définir le code derrière le contrôle de l'utilisateur d'être un générique de type ComboData pour cet exemple.

1

Jetez un oeil à la méthode d'aide Html.DropDownList. Il a un certain nombre de surcharges qui vous permettent de transmettre les données de la liste et de définir l'élément sélectionné. la version la plus simple définit simplement le nom du select.

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

S'il y a une valeur dans le Viewdata [ « SelectStates »] qui est de type MultiSelectList alors la liste sera automatiquement.

Questions connexes