2012-12-19 11 views
7

WebApiを介して返されるオブジェクトに対してクライアント側の検証を実行しようとしています。私はエンティティ編集画面にwebapiを介してエンティティを送信します。私はノックアウトを使用してオブジェクトをフィールドにバインドします。WebApiを使用したクライアント側の検証

私はすでにすべてのサーバー側の検証を処理するアクションフィルターを持っています。 ドメインモデルのデータアノテーションを複製しなくても、クライアント側の検証をどのように組み込むことができますか?

答えて

0

私はHTTP APIを作成するときに、モデルオブジェクト(DTO、リクエストモデルなど)を.NETクライアント用に配布できる別のアセンブリに配置します。

は、次のクラスを考えてみましょう:

public abstract class UserUpdateRequestModel { 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    [Required] 
    [EmailAddress] 
    [StringLength(320)] 
    public string Email { get; set; } 
} 

これは私が私のAPIで使用するものです。

public UserDto PutUser(Guid key, UserUpdateRequestModel requestModel) { 

    // Do something here 
} 

あなたが生成するために、例えば、あなたのASP.NET MVCのクライアントアプリケーションでこの同じモデルを使用することができますASP.NET MVCとしての属性data-の属性を持つHTML入力は、データアノテーションの検証属性に基づいたものを生成する方法を持っています。

+0

ですから、メタデータオブジェクトのいくつかの並べ替えを追加します(含まれています検証属性)をwebapiレスポンスに追加しますか?クライアント側のコードを作成するにはどうすればいいですか? –

+0

@kpore ASP.NET MVCを使用する場合は、それらを作成する方法があります。たとえば、 'TextBoxFor'のhtmlヘルパーメソッドです。見て:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model – tugberk

+0

応答をありがとう。私は実際にMVCを使用していません。私はすべてのコミュニケーションと永続性のためにWebApiを使用しています。 HTMLヘルパーは、従来のMVCコントローラを使用している場合にのみ使用できます。 –

1

WebApiでは、モデル検証の失敗からクライアント側のバリデーターに戻ってくるエラーを接続するための小さな「グルー」コードが必要です。

モデルに
function extractErrors(jqXhr, validator) { 
    var data = JSON.parse(jqXhr.responseText), // parse the response into a JavaScript object 
     errors = {}; 

    $.each(data.ModelState, function (key, value) { 
     var pieces = key.split('.'); 
     key = pieces[pieces.length - 1]; 
     errors[key] = value 
    }); 

    validator.showErrors(errors); // show the errors using the validator object 
} 

、いつものように注釈を付ける:ビューで

[Required] 
[Display(Name = "Group Name")] 
public string Name { get; set; } 

を、ValidationMessageForタグを追加します。

@Html.EditorFor(m => m.Name) 
@Html.ValidationMessageFor(m => m.Name) 
+0

応答フィリップに感謝します。ユーザーに検証が表示される前に、サーバー側のラウンドトリップが必要です。 [Required]属性を取ると、サーバでエラーが発生するまでエラー変数に追加されたことはわかりません。私があなたの解決策を誤解していないか、私の問題を説明するのに叙事詩的に失敗していない限り。 –

+2

真、それはサーバーに値をポストし、jsonの文字列を返します。 私の場合、私のフォームは巨大ではなかったので、クライアント側は「好き」のパフォーマンスを得て、クライアント側は「好き」の動作をしました。 10バレルの小さなフォームでは、サーバのトラッキングコストは で、ローカルサーバに1分の1秒で達する。 企業LANからAWSクラウドサーバに1/10秒で突き当たります。 これは企業のLOBタイプのアプリ用で、おそらくモバイル/低速接続には適していません。 私の場合、モデルに注釈を付けることによるバリデーションの制御は旅行の価値があり、よりクリーンで迅速な開発になりました。 –

+0

追加情報をありがとう、実際には非常に有用です。申し訳ございませんが、一部のフォームは非常に複雑です(たとえば、50-100フォームのフィールドが最悪のシナリオ、トランザクション金融システムを開発している場合など)。おそらく最高のデザインではないかもしれませんが、私たちのビジネスはこれを指示しています。 Azureへの約300〜400mの遠回り旅行になります。 –

関連する問題