カスタム属性に対するクライアントサイドの検証を行う
2023-10-30 01:18:22
質問
Custom Validation Attributeを作成しました。
public class FutureDateAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null|| (DateTime)value < DateTime.Now)
return false;
return true;
}
}
これをクライアント側でもjqueryで動作させるにはどうしたらいいでしょうか?
どのように解決するのですか?
以下はその方法です。
カスタムバリデーション属性を定義することから始めます。
public class FutureDateAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value == null || (DateTime)value < DateTime.Now)
return false;
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessage,
ValidationType = "futuredate"
};
}
}
どのように実装されているかに注目してください。 IClientValidatable . 次に、モデルを書きます。
public class MyViewModel
{
[FutureDate(ErrorMessage = "Should be in the future")]
public DateTime Date { get; set; }
}
次にコントローラ。
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel
{
// intentionally put in the past
Date = DateTime.Now.AddDays(-1)
});
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
で、最後にビューです。
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Date)
@Html.TextBoxFor(x => x.Date)
@Html.ValidationMessageFor(x => x.Date)
<input type="submit" value="OK" />
}
魔法をかけるための最後の部分は、カスタムアダプタを定義することです。
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
// we add a custom jquery validation method
jQuery.validator.addMethod('greaterThan', function (value, element, params) {
if (!/Invalid|NaN/.test(new Date(value))) {
return new Date(value) > new Date($(params).val());
}
return isNaN(value) && isNaN($(params).val()) || (parseFloat(value) > parseFloat($(params).val()));
}, '');
// and an unobtrusive adapter
jQuery.validator.unobtrusive.adapters.add('futuredate', { }, function (options) {
options.rules['greaterThan'] = true;
options.messages['greaterThan'] = options.message;
});
</script>
関連
-
[解決済み] jQueryを使用してハイパーリンクのhref属性を変更する方法
-
[解決済み] Select <a> which href ends with some string
-
[解決済み] jQuery に何かを実行する前にすべての画像の読み込みを待つように指示する公式な方法
-
[解決済み] jQuery: テーブルの行数を数える
-
[解決済み] WebKit の event.layerX と event.layerY に関する問題
-
[解決済み] jQueryを使用してテキストボックスの値を取得するには?
-
[解決済み] jQueryの複数要素の同一クリックイベント
-
[解決済み] jQueryを使用してDropDownListの値を設定するにはどうすればよいですか?
-
[解決済み] jQueryを使用して要素の型を検索する
-
[解決済み] jQueryでinput[type=text]の値変化を検出する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
echarts-all.js:1 Uncaught TypeError: nullのプロパティ'getAttribute'を読み取ることができません。
-
[解決済み] 選択オプション「selected」を値で設定する
-
[解決済み] GoogleのホストされたjQueryを使用する最良の方法、しかしGoogleの私のホストされたライブラリにフォールバックすることは失敗します。
-
[解決済み] jQuery select onChangeの値を取得する。
-
[解決済み] jQuery UIダイアログのクローズボタンを削除するには?
-
[解決済み] 複数のクラスを削除する(jQuery)
-
[解決済み] jQuery に何かを実行する前にすべての画像の読み込みを待つように指示する公式な方法
-
[解決済み] jQueryを使ってロールオーバー時に画像ソースを変更する
-
[解決済み] jQueryを使用して配列から特定の値を削除する方法
-
[解決済み】jQueryがリクエストボディに有効なjsonを投稿する。