5

Razor を使用して ASP.NET で MVC パターンを使い始めたばかりですが、すべてが素晴らしいです! 検証用のモデル注釈は最初は素晴らしく見えましたが、チェックボックスを検証する簡単な方法がないように見え、独自の JQuery 検証をモデルとともにフォームに統合するのが面倒に思えるため、今では非常に面倒になっています。検証。モデルasp.netに注釈を追加することで、あなたのために仕事をしているようです。これは素晴らしいことですが、サイトのカスタマイズに関しては、事前に何もしたくありません。では、JQuery を使用して独自の検証を行うか、モデル内の注釈を使用することに固執する方がよいでしょうか?

ありがとう

4

3 に答える 3

8

クライアント側のみの検証は、セキュリティの観点からは大きな間違いです。サーバー側で確実に検証します。両方を行うのが面倒な場合は、クライアント側の検証を削除してください。

モデルの検証は MVC3 でかなり進んでおり、おそらくあなたが信用しているよりも柔軟です。

たとえば、モデルに IValidatableObject を実装できます。これには、このメソッドを定義する必要があります。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

複数の入力値の組み合わせに基づくルールを含む、あらゆる種類の検証ルールを心ゆくまで配置できます (たとえば、password と password_repeat は等しくなければなりません)。

于 2012-04-25T14:29:43.110 に答える
2

最も重要なことは、サーバー側の検証があることです。データ注釈を使用する必要はありません。IValidatableObject の実装や別の検証フレームワークの統合など、別の検証方法を試すことができます。

私の経験から、データ注釈は (目立たない検証ライブラリと共に)、サーバー側のルールをクライアント側の実装にリンクするための簡単で拡張可能な方法を提供します。別の場所で同じルールを定義するのではありません。

クライアント側の検証を明示的に制御したい場合 (サーバー上でのデータ注釈の動作と同様) は、javascript アダプターを無効にすることができます (これにより、入力フィールドにレンダリングされたデータ属性に基づいてクライアント側の検証規則が追加されます)。クライアント側のルールを手動で実装します。

しかし、アダプターがすべてサーバー側のルール (カスタムの場合もそうでない場合もある) をクライアント側の同等のルールにリンクすることだけを行っている場合、なぜそれを行う必要があるのか​​を理解するのは困難です。

于 2012-04-25T14:52:07.243 に答える
1

モデルの注釈も好きです。あなたが持っているかもしれないjQuery検証は、javascriptを無効にしたり、ハッキングしたりして、誰かがあなたのjQuery検証を回避していないことを確認するために、モデルアノテーションとして配置することもできます...

チェックボックスの検証やその他のカスタマイズされた検証を追加するために私が見つけた最も簡単な方法は、ここで説明するようにCustomValidationAttributeを使用することです。

http://weblogs.asp.net/peterblum/archive/2009/12/07/the-customvalidationattribute.aspx

例:

[CustomValidation(typeof(Category), "FinalCheck")]
public partial class Category
{
   [CustomValidation(typeof(Category), "TestCategoryName")]
   public string CategoryName { get; set; }

   public bool Active { get; set; }

   public bool ShowOnHomepage { get; set; }

   public static ValidationResult FinalCheck(Category pCategory, ValidationContext pValidationContext)
   {
      if (!pCategory.Active && pCategory.ShowOnHomepage)
         return new ValidationResult("The category must be active in order to show it on the homepage.", new List<string> { "Active", "ShowOnHomepage" });
      return ValidationResult.Success;
   }

   public static ValidationResult TestCategoryName(string pNewName, ValidationContext pValidationContext)
   {
      if (Regex.IsMatch(pNewName, @"^\d"))
         return new ValidationResult("Cannot start with a digit", new List<string> { "CategoryName" });
      return ValidationResult.Success;
   }
}
于 2012-04-25T14:32:39.130 に答える