0

フォームを含む ViewModel があります。

@using(Html.BeginForm())
{
     @Html.EditorFor(x=>x.Price)
     <input type="submit" value="Submit" />
}

このビューをロードするコントローラー アクションで、価格を設定してビューに渡します。たとえば、私はそれを 3 に設定しました。

public ActionResult MyAction()
{
     MyModel model = new MyModel();
     model.Price = 3;
     return View(model);
}

私がやりたいことは、このフォームが送信されたときに、ユーザーが送信した値が元の値 (この場合は 3) より小さいかどうかを確認したいということです。それはモデル検証で可能ですか? したがって、2 を入力すると ModelState は無効になりますが、4 を入力すると有効になります。

4

4 に答える 4

0

お知らせするために、元の値を保持するモデルに新しいプロパティを作成し、IValidatableObject を実装するモデルの Validate メソッドで、新しい値が元の値よりも小さいかどうかを確認しました。価値。これで私の問題は解決しました

于 2012-04-05T09:22:13.167 に答える
0

RemoteAttribute はこれに適していると思います:

価格フィールドの上に:

[RemoteAttribute("CheckPrice", "MyController", AdditionalFields="MyModelId")]

コントローラー MyController:

public ActionResult CheckPrice(decimal price, int myModelId){
   //get model by id
   //return valid or invalid
   return Json(true, JsonRequestBehavior.AllowGet);
}

*サーバー側の編集:

RemoteAttribute を継承するカスタム属性を作成し、同じロジックを IsValid メソッドに入れます。

public class MyRemoteAttribute : RemoteAttribute
{
     public MyRemoteAttribute() : base("CheckPrice","Kenmerk"){
         base.HttpMethod = "Post";
     }

     public override bool IsValid(object value){
           //recreate validation here
           //additionalfields can be found in HttpContext.Current.Request.Params
           return true;
     }
}
于 2012-04-04T15:02:00.430 に答える
0

サーバーに毎回値を投稿する必要がある理由...クライアント側で確認してください

于 2012-04-04T15:03:28.757 に答える
0

Price_orig などの非表示フィールドに元の値を含めれば、さまざまなことができます。クライアント側の検証を気にしない場合は、モデルに IValidatableObject を実装します。クライアントの検証が必要な場合は、ここで説明する属性と同様に、別のプロパティの値をチェックするカスタム属性を実装できます。

EF バディ クラスのカスタム属性 (AttributeTargets.Class) を使用したデータ検証

別のオプションは、FluentValidationを使用することです

于 2012-04-04T15:41:21.500 に答える