Sur ma page, j'ai un DropDownList
que je remplis avec des valeurs de base de données à partir d'un SqlDataSource
(voir le code ci-dessous).
Comment puis-je ajouter mon propre texte ou une ligne vide avant les valeurs?
<asp:DropDownList ID="drpClient" runat="server" Width="200px"
AutoPostBack="True" DataSourceID="dsClients" DataTextField="name"
DataValueField="client_id">
</asp:DropDownList>
<asp:SqlDataSource ID="dsClients" runat="server"
ConnectionString="my_connection_string"
ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [client_id], [name] FROM [clients]">
</asp:SqlDataSource>
Merci.
P.S. Recommandez-vous d'utiliser un SqlDataSource
ou est-il préférable de remplir une autre manière?
Vous pouvez simplement ajouter un ListItem à l'intérieur du balisage DropDownList. Toutes les valeurs du DataSource seront ajoutées après cela.
<asp:DropDownList ID="drpClient" runat="server" Width="200px"
AutoPostBack="True" DataSourceID="dsClients" DataTextField="name"
DataValueField="client_id" AppendDataBoundItems="true">
<asp:ListItem>-- pick one --</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="drpClient" runat="server" Width="200px"
AutoPostBack="True" DataSourceID="dsClients" DataTextField="name"
DataValueField="client_id" AppendDataBoundItems="True">
<asp:ListItem Text="" Value="" />
</asp:DropDownList>
C'est facile à manquer, alors n'oubliez pas l'attribut AppendDataBoundItems
que j'ai ajouté.
Je n'ai pas vraiment testé cela, mais je suppose que vous pouvez ajouter un élément après avoir lié la liste déroulante. Vous pouvez ajouter cet événement à n'importe quelle liste déroulante à laquelle vous souhaitez ajouter cette boîte vide.
protected void DropDownList_DataBound(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
ListItem emptyItem = new ListItem("", "");
ddl.Items.Insert(0, emptyItem);
}
Je résous en changeant la commande select en ajoutant une option vide:
<asp:SqlDataSource ID="dsClients" runat="server"
ConnectionString="my_connection_string"
ProviderName="System.Data.SqlClient"
SelectCommand="SELECT [client_id], [name] FROM [clients] union SELECT NULL, '--- pick one ----' ">
</asp:SqlDataSource>
Salutations!!!
Dans l'implémentation de style rasoir chez moi, cela ressemble à ceci:
@Html.EnumDropDownListFor(
model => model.Privilege.Role,
"-- Select role --",
new
{
@style = "width: 216px !important",
@class = "form-control",
id = "role",
required = "required"
})
Et en javascript qui est exécuté à la charge, j'ai ceci:
function PutDefaultPrivilegePanelListHints() {
$('#role').val('');
...
}
Il existe également une solution plus flexible via une validation discrète (sans compter sur HTML5):
$('.required').each(function () { $(this).rules('add', { required: true, messages: { required: '' } }) });
Bien sûr, il y a aussi une vérification côté serveur. Je ne pense pas que ce soit une bonne idée de faire face aux cours. Par exemple, tout ce que je montre dans la page est une classe. Cette classe possède plusieurs propriétés de type énumérables. Ce serait un cauchemar de répliquer toutes ces propriétés, mais de les rendre nullables dans une classe supplémentaire comme certaines suggérées ici sur stackoverflow.
Après tout, pourquoi devrais-je changer ma logique métier pour des raisons de balisage spécifique? Au lieu de cela, je gère tout via javascript et quelques vérifications de modèle.