コントローラで、モデルのクライアント検証ルールにアクセスできるようにしたいと思います。データアノテーションを使用していくつかの属性を添付しましたが、ajax呼び出しを介してクライアントに何かを返し、jquery検証オプションを自動的に構築できるようにしたいと考えています。
通常、これは目立たないもので無料で行われますが、サーバーとクライアントの両方で検証ルールを複製する必要がなく、ノックアウトバインディングを活用しようとしています。
モデルサーバー側でリフレクションを使用しないと、これを実現する方法が少しわかりません。
私の Mvc Controls Toolkit では、ノックアウトライブラリに基づいてヘルパーを開発しました。これらのヘルパーは、ノックアウトコードの記述を支援するだけでなく、控えめな検証とグローバリゼーションによってノックアウトライブラリを強化します。さらに、バインディングメカニズムが拡張され、DatetimePickerなどの複雑なコントロールやその他の「複雑な」(さまざまなhtmlパーツで作成された)コントロールが含まれるようになりました。
最後に、ノックアウトテンプレートはRazorヘルパーを介して定義できます。
ドキュメントを参照してください ここ 、 ここ 、 ここ および ここ 。ヘルパーを使用して高度な機能を実装する方法を示すチュートリアルもいくつかあります。
正確に何をする必要があるかに応じて、 Breeze js が最善の解決策になります。特に、EFを使用している場合は、サーバーEFのDbContext
の機能のほとんどをクライアント側で複製できます。これには、もちろん検証だけでなく、変更の追跡も含まれます。.saveChanges
、 LINQクエリ、キャッシュ、シリアル化、逆シリアル化に似た単純な構文で、オフラインでの作業を可能にします。
Breezejsを使用するための基本的な手順は次のとおりです。
もちろん、サーバーのすべての機能がクライアントに複製されるわけではありませんが、多くのことができます。
saveChanges
を呼び出します。これにより、追跡されたすべての変更がサーバーに転送され、バックエンドが更新されます。.saveChanges
を呼び出すたびに追加のサーバー検証が行われます。最後に、サーバーコードを拡張および変更して、ビジネスロジックを含めることができるため、EFモデルをクライアントに公開するだけでは不十分です。
それはかなりの作業です。それぞれのデータ型変換などを使用して、C#コードをJavascriptに変換できるようにする必要があります。サーバー側とクライアント側の両方で2つの別々の検証セットを書き留めたほうがよいでしょう。独自の変換フレームワークをすべて自分で作成して維持するよりも、維持する方がはるかに簡単です。
モデルで、必要な属性検証を使用します。
public class ModelWithValidation
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
Mvcフォームで
@using( Html.BeginForm())
{
@Html.TextBoxFor(m => m.Name, new {data_bind = "value: name"})
@Html.ValidationMessageFor(m => m.Name)
}
JQueryテストで、フォームがonSubmitで有効かどうか、またはノックアウト保存関数で次のコードを呼び出して入力を検証します。 jQuery.unobtrusive *およびjQuery.validate *ライブラリを含める必要があります。サーバー側でも入力を検証することを忘れないでください!
var form = $("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);
$("form").valid() //true false