MVC 3 + 目立たない検証を使用しています。
一部のフィールドでは、リモート検証も使用しています。リモート検証内で、エラーまたは警告のみを返す可能性のあるいくつかのチェックを行います(エラーをブロックするだけでなく、警告を出すためだけに ajax 検証を利用したいと思います)。説明テキスト内の「Info」接頭辞を使用して、検証エラーによって警告を区別します。
それで、すべての検証エラーを循環させ、表示された警告だけを維持し、表示されたテキストに従ってエラーをオフにする方法はありますか?
ActionFilterAttribute を使用するか、すべての検証エラーをサイクリングしてチェックした後に ModelState.Valid = true を強制することを考えていました...
これは、WarningCheck 属性を使用したリモート検証ルーチンの抜粋です。
[WarningCheck]
public JsonResult CheckMyField(string myfield)
{
//....some check...if ok I do `return Json(true, JsonRequestBehavior.AllowGet);`
//...if just a warning, I do the follow...
string warn = String.Format(CultureInfo.InvariantCulture,
"Info: some info....");
ModelState.AddModelError(TicketHD, esiste);
return Json(warn, JsonRequestBehavior.AllowGet);
}
[AttributeUsage(AttributeTargets.All)]
public class WarningCheckAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//.... here I'd like to cycle my warnings and if possible maintaining just the text display and set errors off...is it possible?
}
}
編集 (特定の警告に対してクライアント側の検証を無効にする方法)
サーバー側の@CDSmith(@Alfalfastrange)の提案に従って、特定のテキストが各検証エラーに含まれている場合、クライアント側の検証も無効にすることに成功しました。特に、エラーに "Info:" テキストが含まれている場合にのみ、クライアント側とサーバー側の両方の検証エラーを無効にする必要がありました。クライアント側の動作に使用しているコードは次のとおりです。
....
$("#ticketfrm").submit();
var isvalid = true;
var errmark = $("#ticketfrm .field-validation-error span");
$(errmark).each(function () {
var tst = $(this).text();
if (!(tst.indexOf("Info") != -1))
isvalid = false; //if the val error is not a warn, the it must be a real error!
});
if (isvalid) {
var form = $('#ticketfrm').get(0); //because I'm inside a jquery dialog
$.removeData(form, 'validator');
jQuery('#ticketfrm').unbind('submit').submit();
}
$("#ticketfrm").submit();
}
.....
これが多くの人に役立つことを願っています...私はこれを機能させるために何時間も働きました! それがよりエレガントなソリューションである必要はないと思いますが、うまくいきます! :) サーバー側の検証については、マークされたソリューションをお読みください。
これが便利だと思ったら、マークしてください。ありがとうございました!