SharePoint 用 Windows Phone アプリでビジネス ロジックとデータ検証を実装するImplement business logic and data validation in a Windows Phone app for SharePoint

Windows Phone の SharePoint リスト アプリケーションのテンプレートを使用して作成した Windows Phone アプリケーションへのデータ入力規則の実装 実稼働環境での使用を目的とした Windows Phone アプリケーションでは、たとえば、特定の状況に関連するビジネス ロジックを適用したり、入力された値が適切な形式であるかを確認したり、あるいは、単に SharePoint リストに値を保存する前に間違いを検出したりするために、ユーザーの入力データを検証する必要があります。Windows Phone の SharePoint リスト アプリケーションのテンプレートをベースにして作成したプロジェクトには既定のデータの入力規則ロジックが含まれていますが、それだけでなく、カスタムのデータ入力規則を実装するためのメカニズムも用意されています。Implement data validation in a Windows Phone app created by using the Windows Phone SharePoint List Application template. In a Windows Phone app intended for production use, you likely need to validate data entered by users to, for example, enforce business logic relevant to your particular circumstances, or to ensure appropriate formatting of entered values, or simply to catch mistakes before saving values to a SharePoint list. Projects based on the Windows Phone SharePoint List Application template include default data validation logic, but such projects also provide a mechanism for developers to implement custom data validation.

重要: Windows Phone 8 用アプリを開発している場合は、Visual Studio 2010 Express ではなく Visual Studio Express 2012 を使用する必要があります。Important: If you are developing an app for Windows Phone 8, you must use Visual Studio Express 2012 instead of Visual Studio 2010 Express. 開発環境を除き、この記事のすべての情報は、Windows Phone 8 用アプリと Windows Phone 7 用アプリを作成する場合に適用されます。Except for the development environment, all information in this article applies to creating apps for both Windows Phone 8 and Windows Phone 7. > 詳細については、「[方法]: SharePoint 用モバイル アプリの開発環境をセットアップする」を参照してください。> For more information, see How to: Set up an environment for developing mobile apps for SharePoint.

既定のデータの入力規則Default data validation rules

SharePoint リストのフィールドのデータ型の一部は、簡易なフォーマット設定またはデータ入力規則に既定で関連付けられています。データ型が SharePoint リストのハイパーリンク型または図型に基づくフィールドに無効な URL を入力して保存しようとすると、入力したアドレスが無効であることを示すメッセージが表示されます。日付/時刻型のフィールドの値としてカスタマー名を入力すると、そのフィールドで有効とされる範囲の日付を入力するように求めるメッセージが表示されます。Some data types for fields in SharePoint lists are associated by default with simple formatting or data validation. If you enter an invalid URL for a field based on the Hyperlink or Picture field type in a SharePoint list and attempt to save your changes, you see a message indicating that the address you entered is invalid. If you enter a customer name as a value for a field based on the Date and Time field type, you receive a message directing you to enter a date within a valid range for the field.

注意

日付の入力検証は SharePoint の日付形式に関する機能です。電話のロケールの日付形式が必要な場合は、フィールドをカスタマイズし、その内容に応じて検証を追加します。Date input validation is with respect to SharePoint date format. If the date format of the phone locale is required, customize the field and add validations accordingly.

また、このような基本の入力規則の一部は、Windows Phone SharePoint リスト アプリケーションのテンプレートから作成した Windows Phone アプリケーションに既定で適用されます。SharePoint リストをベースにした Windows Phone アプリケーションの編集フォームで、日付/時刻型の SharePoint フィールドにバインドされたフィールドに日付以外の値を入力した場合、そのフィールドに関連付けられている TextBox コントロールからフォーカスが移動したときに、入力規則エラー メッセージが表示されます (図 1. を参照)。Some of these basic validation rules are also enforced by default in a Windows Phone app created from the Windows Phone SharePoint List Application template. If you enter anything other than a date value in a field that is bound to a SharePoint field of Date and Time type in the Edit form of a Windows Phone app based on a SharePoint list, you see a validation error message when the focus shifts from the TextBox control associated with the field. (See Figure 1.)

図 1. Windows Phone アプリケーションの入力規則エラー キューFigure 1. Validation error cue in a Windows Phone app

Windows Phone アプリでの検証エラー キュー

編集フォーム内の [開始時刻] という名前のテキスト ボックスは、このサンプル アプリケーションがベースにしている SharePoint リスト内の日付/時刻フィールドにバインドされています。テキスト ボックスに無効な日付が入力されると、図 1 のような入力規則エラー キュー (赤い文字で表示) が表示されます (そして、 TextBox コントロールの Text プロパティに関連付けられている Binding オブジェクトの ValidatesOnNotifyDataErrors プロパティが、EditForm.xaml ファイルの TextBox を定義する XAML 宣言で True に設定されているため、テキスト ボックスからフォーカスが失われます)。The text box labeled "Start Time" in the Edit form is bound to a Date and Time field in the SharePoint list on which this sample app is based. The validation error cue (in red text) shown in Figure 1 appears if an invalid date is entered in the text box (and the text box subsequently loses focus) because the ValidatesOnNotifyDataErrors property of the Binding object associated with the Text property of the TextBox control is set to True in the XAML declaration that defines the TextBox in the EditForm.xaml file.


<StackPanel Orientation="Vertical" Margin="0,5,0,5">
   <TextBlock TextWrapping="Wrap" HorizontalAlignment="Left" 
                    Style="{StaticResource PhoneTextNormalStyle}">Start Time*
   </TextBlock>
   <TextBox Height="Auto" Style="{StaticResource TextValidationTemplate}"
    FontSize="{StaticResource PhoneFontSizeNormal}" Width="470" 
        HorizontalAlignment="Left" Name="txtEventDate"
    Text="{Binding [EventDate], Mode=TwoWay, ValidatesOnNotifyDataErrors=True,
                       NotifyOnValidationError=True}"
    TextWrapping="Wrap" />
   <TextBlock FontSize="16" TextWrapping="Wrap" HorizontalAlignment="Left"
    Style="{StaticResource PhoneTextSubtleStyle}" Text="{Binding DateTimeFormat}" />
</StackPanel>

( ValidatesOnNotifyDataErrors プロパティが False に設定されている場合、入力データが無効であることは、[ 保存] ボタンをクリックするまでユーザーに示されません。入力された日付値のフォーマットの検証は引き続き EditItemViewModel クラスの派生元である基本クラスによって実行されるため、ボタンがクリックされた時点で入力規則エラーに関するエラー メッセージが表示されます。)(If the ValidatesOnNotifyDataErrors property is set to False, the user has no indication that the entered data is invalid until the Save button is chosen. At that point, the user sees an error message regarding validation errors, because format validation on entered date values is still carried out by the base class from which the EditItemViewModel class is derived.)

しかし、フィールドによっては、Windows Phone アプリケーションに無効なデータが入力されても通知を一切行いません。さらに、適切に設計された Visual Studio プロジェクト テンプレートであれば、多様なアプリケーションのスタート地点として使用されるべく、必然的に一般化されています。Windows Phone SharePoint リスト アプリケーションのテンプレートには特定のコンテキストに関連する入力規則を含めることはできませんが、一般化されたテンプレートとしてなら値を保持できます。自分のニーズと、開発した Windows Phone アプリケーションが使用される状況によっては、カスタムのデータ入力規則を実装したい場合もあります。But some fields may not provide any notification for invalid data in the Windows Phone app. And well-designed Visual Studio project templates are necessarily generalized to be used as a starting point for many different applications. The Windows Phone SharePoint List Application template can't include validation rules relevant to specific contexts and yet retain its value as a generalized template. Depending on your needs and the circumstances in which your particular Windows Phone app will be used, you likely will want to implement your own custom data-validation rules.

カスタムのデータ入力規則の実装Implement custom data-validation rules

開発した Windows Phone アプリケーションにユーザーが入力したデータを検証するには、さまざまな方法があります。Windows Phone SharePoint リスト アプリケーションのテンプレートを使用して作成したプロジェクトには、Windows Phone アプリケーション内のデータのフォーム (ビュー。例: EditForm.xaml ファイル) と、そのアプリケーションがベースにしている SharePoint リスト内のデータ自体との仲介役として機能するクラスが含まれます。これらのクラスは、 Model-View-ViewModel 設計パターン (図 2) の ViewModel コンポーネントの実装と見なすことができます (MVVM ソフトウェア設計パターンに対する Windows Phone SharePoint リスト アプリケーションのテンプレートの適合について詳しくは、「 Windows Phone SharePoint List Application テンプレートのアーキテクチャ」を参照してください)。You can validate data entered by users of your Windows Phone app in several ways. A project created by using the Windows Phone SharePoint List Application template includes classes that serve as intermediaries between the forms (that is, the views) of the data in the Windows Phone app (for example, the EditForm.xaml file) and the data itself in the SharePoint list on which the app is based. These classes can be considered implementations of the ViewModel component of the Model-View-ViewModel design pattern (Figure 2). (For more information about how the Windows Phone SharePoint List Application template conforms to the MVVM software design pattern, see Architecture of the Windows Phone SharePoint List Application template.)

注意

SharePoint リスト テンプレートには既定の入力規則 (SharePoint タスク リストの達成率、チーム ディスカッション リストの事後チェック、および SP 10 進数フィールド型の入力規則など) は含まれませんが、これらの入力規則を実装することができます。The SharePoint list templates do not include default validations (such as percentage complete in a SharePoint task list, post check for a team discussion list, and SP decimal field type validation), but you can implement such validations.

図 2. ViewModel コンポーネントのテンプレート ファイルFigure 2. Template files in ViewModel component

ViewModel コンポーネントのテンプレート ファイル

MVVM パターンに基づいて設計されたアプリケーションでは、データの入力規則はしばしば、データ層 (Model コンポーネント) によって処理されます。Windows Phone SharePoint リスト アプリケーションのテンプレートから作成したプロジェクトでは、開発者がデータ入力規則を管理しやすいように、データ入力規則のための拡張可能なメカニズムがレイヤーにプッシュされ、ViewModel コンポーネントに実装されています。したがって、このテンプレートに基づいたプロジェクトでは、ユーザー入力を検証するかあるいは別の方法でデータを管理するカスタム コードに最適な場所は、これらの ViewModel クラス内です。データ入力規則の観点からは、 EditItemViewModel クラスおよび NewItemViewModel クラス (リスト データの編集と更新によく使用されるフォームに関連付けられているクラス) は、どちらも、この 2 つのクラスの派生元のクラス内の基本の検証メソッドをオーバーライドする検証メソッド ( Validate) のオープンな実装を提供します。In applications designed based on the MVVM pattern, data validation is often handled in the data layer (that is, in the Model component). In projects created from the Windows Phone SharePoint List Application template, an extensible mechanism for data validation has been "pushed up" a layer and implemented in the ViewModel component, to make it easier for developers to manage data validation. In projects based on the template, therefore, the most suitable place for custom code that validates user input or otherwise manages data is in these ViewModel classes. In terms of data validation, the EditItemViewModel class and the NewItemViewModel class (the classes associated with the forms most likely to involve editing and updating list data) both provide an open implementation of a validation method (named Validate) that overrides the base validation method in the class from which these two classes are derived.


public override void Validate(string fieldName, object value)
   {
      base.Validate(fieldName, value);
   }

このメソッドは、個別のフィールドを対象とするカスタム入力規則ロジックを追加したい開発者向けの便利なメカニズムを提供します。一般的なアプローチでは、自分のカスタム入力規則コードに関連付けるフィールドを特定するために、 Validate メソッドに渡される fieldName 引数の値を確認します。たとえば、このメソッドの実装で switch ステートメントを使用することで、開発した Windows アプリケーションの編集フォーム (EditForm.xaml) 内のさまざまなフィールドに固有の入力規則ロジックを提供できます。This method provides a convenient mechanism to the developer for adding custom validation logic that targets individual fields. The general approach is to check the value of the fieldName argument passed to the Validate method to identify the field you want to associate with your custom validation code. You can, for example, use a switch statement in your implementation of this method to supply validation logic specific to various fields in the Edit form (EditForm.xaml) of your Windows app.

次のコード例では、SharePoint Server のインストールに、カスタム リストのテンプレートから作成した製品注文リストが含まれていると仮定しています。このリストは、表 1 に示す列とフィールドのデータ型から成ります。For the following code example, assume that an installation of SharePoint Server has a Product Orders list created from the Custom List template. The list has been created with the columns and field types shown in Table 1.

表 1. 製品注文リストTable 1. Product Orders list

Column Type 必須Required
Product (すなわち、タイトル)Product (i.e., Title)
1 行テキスト (Text)Single line of text (Text)
はいYes
説明Description
1 行テキスト (Text)Single line of text (Text)
いいえNo
数量Quantity
NumberNumber
はいYes
Order DateOrder Date
日付/時刻 (DateTime)Date and Time (DateTime)
いいえNo
Fulfillment DateFulfillment Date
日付/時刻 (DateTime)Date and Time (DateTime)
いいえNo
Contact NumberContact Number
1 行テキスト (Text)Single line of text (Text)
いいえNo

繰り返しますが、この例の目的は、Contoso, Ltd. という架空の企業で採用されているビジネス ロジックに基づき、指定された製品注文システムで、次のシンプルな入力規則が適用されるようにすることです。Again, for the purposes of this example, assume that the following simple validation rules are to be enforced, based on the business logic employed at the fictitious company Contoso, Ltd., for a given product ordering system:

  • 注文の納品日は、発注日よりも後の日付である必要があります。Fulfillment dates for orders must be later than the date on which the order was placed.

  • Fuzzy Dice という製品を注文する場合、ペアで注文する必要があります。Contoso, Ltd 固有の入力規則に従うと、Fuzzy Die という単数の製品は存在しません。If a customer wants to place an order for a product named Fuzzy Dice, the dice must be ordered in pairs. According to the peculiar rules at Contoso, Ltd., there is simply no such thing as a Fuzzy Die.

  • 製品注文リストで、連絡先電話番号フィールドのデータ型は "1 行のテキスト" (テキスト型) であり、任意のテキストを入力できます (既定では 255 文字以内まで)。この例では、一般的な電話番号フォーマットの 1 つである "(555) 555-5555" の形式によるデータの入力を求めるフォーマット入力規則が適用されます。In the Product Orders list, the field type for phone numbers is "Single line of text" (that is, Text), which can be any text (up to 255 characters by default). For this sample, a formatting validation rule will be enforced that requires entered data to be in one of the common phone number formats; for example, "(555) 555-5555".

カスタムの入力規則を実装するにはTo implement custom validation rules

  1. 表 1 で指定した列とデータ型を含むカスタム リスト テンプレートをベースにした SharePoint リストが作成済みであることを前提として、Visual Studio の Windows Phone SharePoint リスト アプリケーションのテンプレートを使用して、「 [方法] Windows Phone 用の SharePoint リスト アプリを作成する」の手順に従って Windows Phone アプリケーションを作成します。Assuming you have created a SharePoint list based on the Custom List template that includes the columns and types specified in Table 1, create a Windows Phone app by using the Windows Phone SharePoint List Application template in Visual Studio by following the steps detailed in How to: Create a Windows Phone SharePoint list app.

  2. ソリューション エクスプローラーで、プロジェクトの ViewModels フォルダーに移動し、EditItemViewModel.cs ファイルをダブルクリック (またはこのファイルを選択して F7キーを押し)、ファイルを開いて編集できるようにします。In Solution Explorer, in the ViewModels folder for the project, double-click the EditItemViewModel.cs file (or choose the file and press F7) to open the file for editing.

  3. 次の using ディレクティブを、ファイルの上部にあるディレクティブのリストに追加します。Add the following using directives to the list of directives at the top of the file.


using System.Globalization;
using System.Text.RegularExpressions;
  1. ファイル内の Validate メソッドの既定の実装を次のコードに置き換えます。Replace the default implementation of the Validate method in the file with the following code.

public override void Validate(string fieldName, object value)
{
    string fieldValue = value.ToString();
    if (!string.IsNullOrEmpty(fieldValue)) //Allowing for blank fields.
    {
        bool isProperValue = false;

        switch (fieldName)
        {
            case "Quantity":
                // Enforce ordering Fuzzy Dice in pairs only.
                int quantityOrdered;
                isProperValue = Int32.TryParse(fieldValue, out quantityOrdered);
                if (isProperValue)
                {
                    if ((quantityOrdered % 2) != 0) // Odd number of product items ordered.
                    {
                        if ((string)this["Title"] == "Fuzzy Dice")
                        {
                            AddError("Item[Quantity]", "Fuzzy Dice must be ordered in pairs. 
                                                                   No such thing as a Fuzzy Die!");
                        }
                        else
                        {
                            // Restriction on ordering in pairs doesn't apply to other products.
                            RemoveAllErrors("Item[Quantity]");
                        }
                    }
                    else
                    {
                        RemoveAllErrors("Item[Quantity]");
                    }
                }
                break;
            case "Fulfillment_x0020_Date":
                // Determine whether fulfillment date is later than order date.
                DateTime fulfillmentDate;
                isProperValue = DateTime.TryParse(fieldValue, CultureInfo.CurrentCulture, 
                              DateTimeStyles.AssumeLocal, out fulfillmentDate);
                if (isProperValue)
                {
                    DateTime orderDate;
                    isProperValue = DateTime.TryParse((string)this["Order_x0020_Date"], 
                               CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out orderDate);

                    if (fulfillmentDate.CompareTo(orderDate) > 0)
                    {
                        RemoveAllErrors("Item[Fulfillment_x0020_Date]");
                    }
                    else
                    {
                        AddError("Item[Fulfillment_x0020_Date]", 
                                "Fulfillment Date must be later than Order Date.");
                    }
                }
                break;
            case "Contact_x0020_Number":
                // Check that contact number is in an appropriate format.
                Regex rx = new Regex(@"^\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$");
                if (rx.IsMatch(fieldValue))
                {
                    RemoveAllErrors("Item[Contact_x0020_Number]");
                }
                else
                {
                    //Specified Contact Number is not a valid phone number.
                    AddError("Item[Contact_x0020_Number]", "Specified Contact Number is invalid.");
                }
                break;
            default:
                // Not adding custom validation for other fields.
                break;
        }
    }

    //And then proceed with default validation from base class.
    base.Validate(fieldName, value);
}
Keep in mind that the field names specified in this code sample are based on properties of the sample Product Orders list specified in Table 1. (Notice that in the XML schema for list fields in SharePoint Server, spaces in the names of fields are replaced with the string "_x0020_" for the **Name** attribute of the **Field** element that defines a given field. The template uses the **Name** attribute for a **Field** element as it is defined in the XML schema on the server, not the **DisplayName** attribute.) You can identify the field names of those fields for which you want to implement validation logic by looking at the **Binding** declarations of the **Text** properties for the **TextBox** objects defined in EditForm.xaml or by examining the **ViewFields** string of the **CamlQueryBuilder** class in the ListProvider.cs file.
  1. ファイルを保存します。Save the file.

このサンプルのカスタム検証コードは、Validate メソッドに渡された value 引数が null 値または空の文字列でない場合にのみ実行されます。The custom validation code in this sample is executed only if the value argument passed to the Validate method is not a null or empty string. 表 1 に示されているように、納品日および連絡先フィールドにはデータを含める必要はありません (このサンプルでは、リストが SharePoint Server に定義されているため) ので、これらのフィールドは空白にしてください。As indicated in Table 1, the Fulfillment Date and Contact Number fields are not required to contain data (as the list is defined for the purposes of this sample in SharePoint Server), so we want to allow these fields to be blank. 渡された値が長さ 0 の文字列 (null 値とは異なる) である可能性があるため、value 引数が null 値かどうかを判断する単純なチェックでは不十分です。このサンプルの場合、空白になりうるフィールドに対しては、長さ 0 の文字列を無効にすることが望ましいです。A simple check to determine whether the value argument is null is not sufficient, because the value passed could be a zero-length string (which doesn't equate to a null value), and for this sample we don't want to invalidate zero-length strings for fields that can be blank. 数量および納品日フィールドの検証ロジックには、渡された値が適切なタイプであることを確認するための追加チェックが含まれています。The validation logic for the Quantity and Fulfillment Date fields includes additional checks of the values passed in to ensure that they are of the appropriate type. 最初のチェック (switch 文の前) で渡された値が null 値ではないことのみを確認した (長さ 0 の文字列であるという、より細かい条件をチェックするのではなく) 場合、これらの検証では値が長さ 0 の文字列であるかどうかの検証は実行しません。しかし、連絡先フィールドのデータを検証するためのロジックでは、渡された値が長さ 0 の文字列かどうかの検証を実行しますIf the initial check here (before the switch statement) confirmed only that the value passed in were not null (instead of checking against the narrower condition of being a zero-length string), those validations would still not execute if the value were a zero-length string, but the logic to validate data for the Contact Number field would still execute if the value passed were a zero-length string. このサンプルでは、特にユーザーが編集フォームを開いてリスト アイテムの編集を始めるときは、連絡先フィールドを空白 (長さ 0 の文字列) にできるようにするのが望ましいです。And in this sample we want to allow for the Contact Number field to be blank (a zero-length string), especially when a user starts editing a list item by opening the Edit form.

プロジェクトをビルドし、Windows Phone エミュレーターに展開して実行する場合、アプリケーションの編集フォーム内のフィールド リストにビジネス ルールに違反するデータを入力することで、入力規則ロジックをテストできます (図 3 を参照)。If you build the project and deploy it to Windows Phone Emulator to run it, you can test your validation logic by entering data that violates your business rules into the fields of the list in the Edit form of the app. (See Figure 3.)

図 3. カスタムの入力規則エラー キューFigure 3. Custom validation error cues

カスタム検証のエラー キュー

このサンプルのコードが EditItemViewModel.cs ファイルのみに含まれる場合には、これらの入力規則は、編集フォームにユーザーが入力したデータに対してのみ適用されます。The code in this sample, if it is included in the EditItemViewModel.cs file only, enforces these validation rules for data entered by users only on the Edit Form. これらの入力規則を、ユーザーが新しいアイテムを追加するときと、それらのアイテムを編集するときの両方の場面で適用したい場合には、同じ入力規則ロジックを NewItemViewModel.cs ファイルの Validate メソッドに含める必要があります (または、できれば、この入力規則ロジックを含む関数を記述したクラス ファイルを別途作成し、同じ関数を EditItemViewModel.cs ファイルと NewItemViewModel.cs ファイルの両方の Validate メソッドから呼び出します)。If you want to enforce the validation rules both when users add new items as well as when they edit them, you must include the same validation logic in the Validate method in the NewItemViewModel.cs file (or, preferably, create a separate class file with a function that includes this validation logic and call that same function from the Validate methods in both the EditItemViewModel.cs file and the NewItemViewModel.cs file).

このサンプルの入力規則ロジックは、ユーザーが入力したデータが入力規則によって許可されている形式ではないことを示すことによって、特定のビジネス ルールを適用しますが、入力データがこのコードによって妨害されたり、変更されることはありません。SharePoint リストにデータを保存する前に、たとえば電話番号を一貫性のある形式に揃えるためにデータを妨害するには、入力された電話番号用のカスタムのデータ変換を実装できます。リスト アイテム フィールドのカスタム データ変換の詳細については、「 [方法] Windows Phone アプリ用に SharePoint フィールド タイプをサポートおよび変換する」を参照してください。The validation logic in this sample enforces given business rules by indicating to the user that entered data is not in a format permitted by the rules, but the entered data is not intercepted and changed by this code. To intercept and, for example, format phone numbers in a consistent way before saving the data to the SharePoint list, you can implement custom data conversion for entered phone numbers. For an explanation of custom data conversion for list item fields, see How to: Support and convert SharePoint field types for Windows Phone apps.

関連項目See also