Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:ASP.NET MVC 5 実践プログラミング

書籍転載:ASP.NET MVC 5 実践プログラミング

ASP.NET MVC 5.2: 選択ボックスの選択肢をグループ化する - SelectListクラス[Razor]

2014年10月14日

ASP.NET MVC 5.2以降。Razorで、選択肢をグルーピングした選択ボックスを生成するにはSelectListクラスを使用する。その使い方を解説。書籍転載の9本目(基礎編「4-2-6」)。

  • このエントリーをはてなブックマークに追加

書籍転載について

 本コーナーは、秀和システム発行の書籍『ASP.NET MVC 5 実践プログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『ASP.NET MVC 5 実践プログラミング』の詳細や購入は秀和システムのサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

4-2-6 選択ボックスの選択肢をグループ化する[5.2] - SelectListクラス

 選択ボックスでは、<optgroup>要素を利用することで、選択肢をグループで分類できます。たとえば、以下はカテゴリー(Category)の単位でグループ分けした記事タイトルを選択ボックスに表示した例です。

HTML
<select id="Url" name="Url">
  <option value="">選択してください</option>
  
  <optgroup label="Reference">
    <option selected="selected"
      value="https://www.buildinsider.net/web/jquerymobileref">
      jQuery Mobile 逆引きリファレンス
    </option>
  
    <option value="https://www.buildinsider.net/web/jqueryuiref">
      jQuery UI 逆引きリファレンス
    </option>
  </optgroup>
  
  <optgroup label="DotNet">
    <option value="http://codezine.jp/article/corner/518">
      Bootstrap でレスポンシブでリッチなサイトを構築
    </option>
  
    <option value="http://codezine.jp/article/corner/511">
      ASP.NET Identity 入門
    </option>
  
    <option disabled="disabled"
      value="http://www.wings.msn.to/mvc5">
      ASP.NET MVC 入門
    </option>
  </optgroup>
  
  <optgroup label="Cloud">
    <option value="http://codezine.jp/article/corner/513">
      Amazon Web Servicesによるクラウド超入門
    </option>
    
    <option value="http://www.wings.msn.to/azure">
      Azure 新機能 TIPS
    </option>
  </optgroup>
</select>
図4-2 選択オプションをグループ化した選択ボックス
図4-2 選択オプションをグループ化した選択ボックス
図4-2 選択オプションをグループ化した選択ボックス

 選択肢が増えて、かつ、選択肢を意味あるキーでグルーピングできる場合には、積極的に<optgroup>要素を利用することで、選択ボックスが見やすく、選びやすくなります。

 では、このような選択ボックスを生成する例を見てみましょう。

C#
 
 
 
2
 
 
 
 
 
 
 
 
1
 
 
 
public ActionResult SelectGroup()
{
  // 選択オプションのリスト(Url/Title/Categoryプロパティを持つオブジェクト)
  var articles = from a in db.Articles
                 select new { Url = a.Url, Title = a.Title, Category = a.Category };

  // 無効オプションのリスト(Url文字列)
  var disabled = from a in db.Articles
                 where a.Released == false
                 select a.Url; 

  // 選択リストを定義
  ViewBag.Opts = new SelectList(
    articles, "Url", "Title", "Category", null, disabled);
  return View(db.Articles.Find(1));
}
リスト4-11 Controllers/ViewController.cs
Razor
@model MvcRoute.Models.Article
...中略...

@Html.DropDownListFor(Model => Model.Url,
  (SelectList)ViewBag.Opts, "選択してください")
リスト4-12 Views/View/SelectGroup.cshtml

 <optgroup>要素を利用するには、選択オプションをSelectListクラスとして準備します(1)。

【構文】SelectListコンストラクター

SelectList(IEnumerable items, string dataValueField, string dataTextField [[,string dataGroupField],object selectedValue [,IEnumerable disabledValues]])

  • items: 選択オプションを表すオブジェクト群
  • dataValueField: value属性に割り当てられるプロパティ
  • dataTextField: テキストに割り当てられるプロパティ
  • dataGroupField: グループとして利用されるプロパティ
  • selectedValue: デフォルト値*11
  • disabledValues: 無効にする値
  • *11 サンプルでは、モデルの値が自動セットされますのでnullとしています。

 引数dataGroupFielddisabledValuesを指定する場合は、引数selectedValueは省略できませんので、注意してください。一般的に、XxxxxForメソッドを利用する場合には、モデルの現在値が無条件にデフォルト値になりますので、引数selectedValueには無条件にnullを指定します。

 選択オプション/無効オプションを取得するには、LINQ to Entitiesというしくみを利用しています(2)。詳しくは5-3節(後日公開予定)で触れますので、それぞれ、

  • Url/Title/Categoryプロパティを持つ匿名型のリスト
  • Urlプロパティ(文字列)のリスト

を生成している、とだけ理解しておいてください。

メソッド概要
BeginForm フォームを生成(<form>タグ)
BeginRouteForm フォームを生成(<form>タグ。ルートパラメーターで指定可能)
EndForm フォームを終了(</form>閉じタグ)
LabelForLabel ラベルを生成
TextBoxForTextBox テキストボックスを生成
TextAreaForTextArea テキストエリア(複数行テキストボックス)を生成
PasswordForPassword パスワード入力ボックスを生成
HiddenForHidden 隠しフィールドを生成
RadioButtonForRadioButton ラジオボタンを生成
CheckBoxForCheckBox チェックボックスを生成
DropDownListForDropDownList 選択ボックスを生成
EnumDropDownListFor Enum型をもとに選択ボックスを生成
ListBoxForListBox リストボックスを生成
表4-1 フォーム関連のビューヘルパー(再掲)

※以下では、本稿の前後を合わせて5回分(第7回~第11回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

書籍転載:ASP.NET MVC 5 実践プログラミング
7. 選択ボックス/リストボックスを生成する - DropDownListFor/ListBoxForメソッド[Razor]

DropDownListFor/ListBoxForメソッドを使って、単一選択式の選択ボックスや複数選択式のリストボックスを生成する方法を解説。書籍転載の7本目(基礎編「4-2-4」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
8. ASP.NET MVC 5.1: 列挙型から選択ボックスを生成する - EnumDropDownListメソッド[Razor]

ASP.NET MVC 5.1以降。列挙型の情報をもとに選択ボックスを生成するEnumDropDownListメソッドの使い方を解説。書籍転載の8本目(基礎編「4-2-5」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
9. 【現在、表示中】≫ ASP.NET MVC 5.2: 選択ボックスの選択肢をグループ化する - SelectListクラス[Razor]

ASP.NET MVC 5.2以降。Razorで、選択肢をグルーピングした選択ボックスを生成するにはSelectListクラスを使用する。その使い方を解説。書籍転載の9本目(基礎編「4-2-6」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
10. Label/TextBox/TextArea/Password/Hidden/ RadioButton/CheckBoxメソッド[Razor]

XxxxxForメソッドとは異なり、「For」なしのメソッドは、モデルから独立したフォーム要素を生成できる。その使い方を解説。書籍転載の10本目(基礎編「4-2-7」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
11. リンク/エンコード関連のビューヘルパー|ハイパーリンクを生成する - ActionLinkメソッド[Razor]

リンク/エンコード関連のビューヘルパー紹介の1つ目として、アンカータグを生成するためのメソッドの基本的な使い方を解説する。書籍転載の11本目(基礎編「4-3-1」)。

サイトからのお知らせ

Twitterでつぶやこう!