SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法

ASP.NET 4.5の「Scaffolding(スキャフォールディング)」機能を試す(後編)

実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法 第7回

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

生成コードのカスタマイズ

 最後に、Scaffoldingで生成されたコードのカスタマイズ方法を簡単に紹介します。今回行うカスタマイズは次のとおりです。

  • 会議室メンテナンス画面を作成する
  • 会議室情報を入力する際、場所をドロップダウンリストで選択する
  • UIを日本語化する

 ポイントは、ASP.NET Dynamic Dataの「フィールドテンプレート」を使うことです。今回のカスタマイズに当たり、以下の記事を参考にしましたので、併せて確認してください。

 それでは、順番に見ていきましょう。

会議室メンテナンス画面を作成する

 カスタマイズを行う元コードを生成するため、会議室のデータモデルクラス「MeetingRoom」を新たに作成し、Scaffoldingでコードを生成します(リスト4)。

リスト4 会議室のデータモデルクラス(Models\MeetingRoom.cs)
using System;
using System.ComponentModel.DataAnnotations;

namespace MRRS_Scaffolding.Models
{
  public class MeetingRoom
  {
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [Display(Name = "会議室名")]
    [Required(ErrorMessage = "会議室名を入力してください。")]
    public string Name { get; set; }

    [Display(Name = "場所")]
    [UIHint("Location")]
    [Required(ErrorMessage = "場所を入力してください。")]
    public int LocationId { get; set; }
  }
}

 ここでのポイントは、会議室データモデル内の場所ID(LocationId)にUIHint属性を指定していることです。UIHint属性を指定することで、Dynamic Dataが使用するテンプレートファイルを明示的に指定できます。ここでは"Location"という名前を指定します。

場所をドロップダウンリストで選択

 DynamicData\FieldTemplatesフォルダーに、表示、編集用にDynamic Dataのフィールドテンプレートファイルを、それぞれLocation.ascx(.cs)、Location_Edit.ascx(.cs)として作成します(Enumeration.ascx、Enumeration_Edit.ascxをコピーして直すと簡単です)。これらのファイル名の"Location"はデータモデルのフィールドにUIHint属性で指定した名前と同じにします。このようにするのは、Dynamic Dataのテンプレート選択順がUIHint→フィールドの型の順になっているためです。従って、MeetingRoomクラスのLocationIdフィールドにUIHint属性を設定しないと、DynamicData\FieldTemplatesフォルダーのInteger.ascx(.cs)とInteger_Edit.ascx(.cs)がテンプレートとして使われます。

 では、実際のコードを見てみましょう。まずは場所を表示するLocation.ascx(.cs)からです(リスト5、6)。

リスト5 場所表示テンプレート(DynamicData\FieldTemplate\Location.ascx)
<%@ Control Language="C#" CodeBehind="Location.ascx.cs"
  Inherits="MRRS_Scaffolding.LocationField" AutoEventWireup="True" %>

<%-- コードビハインドに定義したGetNameメソッドで場所名を取得表示する --%>
<asp:Literal runat="server" ID="Literal1" Text="<%# GetName() %>" />
リスト6 場所表示テンプレートのコードビハインド(DynamicData\FieldTemplate\Location.ascx.cs)
using System
using System.Web.UI;
using MRRS_Scaffolding.Models;

namespace MRRS_Scaffolding
{
  public partial class LocationField : System.Web.DynamicData.FieldTemplateUserControl
  {
    public string GetName()
    {
      // データバインドしたフィールドの値を取得
      // (結果としてLocationIdが取得できる)
      var id = (int)FieldValue;

      // LocationIdに対応する場所名を取得、返却する
      var context = new MRRSContext();
      var record = context.Location.Find(id);
      return record.Name;
    }
  }
}

 まず、ascxファイル側で場所を表示する際、コードビハインドに定義したGetNameメソッドを使ってその内容を取得するようにします。GetNameメソッドでは、生成したMRRSContextクラスを使い、Idに対応した場所名を取得、返却します。このときはIdはデータバインドされた値を使うため、FieldValueプロパティから取得します。

 次に登録画面、編集画面で使用される、場所の入力を行うLocation_Edit.ascx(.cs)です(リスト7、8)。

リスト7 場所入力テンプレート(DynamicData\FieldTemplate\Location_Edit.ascx)
<%@ Control Language="C#" CodeBehind="Location_Edit.ascx.cs"
   Inherits="MRRS_Scaffolding.Location_EditField" AutoEventWireup="True" %>

<%-- 場所を表示するドロップダウンリスト --%>
<asp:DropDownList ID="DropDownList1" runat="server" CssClass="DDDropDown"
  DataSourceID="LinqDataSource1" DataTextField="Name" DataValueField="Id"
  AppendDataBoundItems="true">
  <asp:ListItem Text="" Value="" />
</asp:DropDownList>

<%-- MRRSContextクラスを使い、場所のId、名前をドロップダウンリスト編集用に取得する --%>
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
  ContextTypeName="MRRS_Scaffolding.Models.MRRSContext" EntityTypeName=""
  Select="new (Id, Name)" TableName="Location"></asp:LinqDataSource>

<%-- 場所は必須入力とする --%>
<asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1"
  CssClass="DDControl DDValidator" ControlToValidate="DropDownList1"
  Display="Static" Enabled="false" />

<%-- その他、動的な入力チェックに対応する --%>
<asp:DynamicValidator runat="server" ID="DynamicValidator1"
  CssClass="DDControl DDValidator" ControlToValidate="DropDownList1"
  Display="Static" />
リスト8 場所入力テンプレートのコードビハインド(DynamicData\FieldTemplate\Location_Edit.ascx.cs)
using System;
using System.Collections.Specialized;
using System.Web.UI;

namespace MRRS_Scaffolding
{
  public partial class Location_EditField : System.Web.DynamicData.FieldTemplateUserControl
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      // 検証コントロールをValidationGroupに所属させる
      SetUpValidator(RequiredFieldValidator1);
      SetUpValidator(DynamicValidator1);
    }

    protected override void OnDataBinding(EventArgs e)
    {
      base.OnDataBinding(e);
      // データを表示するタイミングで、場所Idに対応するリスト項目を表示させる
      DropDownList1.SelectedValue = FieldValueString;
    }

    protected override void ExtractValues(IOrderedDictionary dictionary)
    {
      // 入力したデータをデータソースに反映させるタイミングで、
      // 選択した場所のIdを設定する
      dictionary[Column.Name] = DropDownList1.SelectedValue;
    }
  }
}

 場所をドロップダウンリストで入力させるため、DropDownListコントロールを配置します。そして、DataSourceIdに表示する場所を取得するためのデータソースコントロールを指定します。今回はLinqDataSourceコントロールを使い、MRRSContextを使って場所を取得しています。

 コードビハインド側では、まずPage_Loadでascxファイルで追加した検証コントロールを、ValidationGroupに所属させるため、SetUpValidatorメソッドを呼び出します。

 次に、データバインドしたデータを表示する際、Idに対応して選択項目を表示するため、OnDataBindingメソッドをオーバーライドします。表示側と違い、ここではId値を文字列として使用したいので、FieldValueStringプロパティを使います。

 最後に、選択した場所の値をデータソース側にバインドするため、ExtractValuesメソッドをオーバーライドします。このメソッドでは、dictionay引数にデータソースの項目名をキーとして値を設定することで、データソースにその値を設定できます。従って、DropDownListのSelectedValueプロパティで、選択した場所のIdを設定します。

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET 4.5 Webフォーム 新機能活用法連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7530 2013/12/16 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング