私のページにはDropDownList
があり、SqlDataSource
からデータベース値を取り込みます(以下のコードを参照)。
値の前に独自のテキストまたは空白行を追加するにはどうすればよいですか?
<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>
ありがとう。
追伸SqlDataSource
を使用することをお勧めしますか、それとも別の方法で入力する方が良いですか?
DropDownListマークアップ内に ListItem を追加するだけです。その後、DataSourceからのすべての値が追加されます。
<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>
見逃しやすいので、追加したAppendDataBoundItems
属性を忘れないでください。
これは実際にはテストしていませんが、ドロップダウンリストをバインドした後にアイテムを追加できると想定しています。この空のボックスを追加するドロップダウンリストにこのイベントを追加できます。
protected void DropDownList_DataBound(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
ListItem emptyItem = new ListItem("", "");
ddl.Items.Insert(0, emptyItem);
}
空のオプションを追加するselectコマンドの変更を解決します。
<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>
こんにちは!!!
私のかみそりスタイルの実装では、次のようになります。
@Html.EnumDropDownListFor(
model => model.Privilege.Role,
"-- Select role --",
new
{
@style = "width: 216px !important",
@class = "form-control",
id = "role",
required = "required"
})
そして、ロード時に実行されるjavascriptにはこれがあります:
function PutDefaultPrivilegePanelListHints() {
$('#role').val('');
...
}
控えめな検証によるより柔軟なソリューションもあります(HTML5に依存しません):
$('.required').each(function () { $(this).rules('add', { required: true, messages: { required: '' } }) });
もちろん、サーバー側のチェックもあります。クラスに対処するのは良い考えだとは思いません。たとえば、ページに表示するものはすべてクラスです。このクラスには、列挙可能な型プロパティがいくつかあります。これらすべてのプロパティを複製するのは悪夢ですが、スタックオーバーフローでいくつかのプロパティが示唆しているように、いくつかの追加クラスでそれらをnull可能にします。
結局のところ、特定のマークアップのためにビジネスロジックを変更する必要があるのはなぜですか?代わりに、javascriptといくつかのモデルチェックを介してすべてを処理します。