2011-06-17 12 views
4

ASP.NET MVC3の控えめな検証機能を使用すると、検証を実行する前にJavaScriptを実行するにはどうすればよいですか? Jqueryのサブミット・ハンドラは、明白な理由から検証後に実行されます。私は、送信ボタンのクリックにフックすることができますが、それは非常にエレガントなようではありません。助言がありますか?ASP.NET MVC 3邪魔にならない検証 - イベントを検証する前に?

EDIT

私の上記のステートメントが間違って表示されます。下に指摘したように、送信ハンドラは検証の前に実行されます。残念ながらそれは私の問題を解決しません。

私の改訂質問:

私はフォーム送信後が、jQueryの検証の前にフォーム値を操作する必要があります。 jQueryのサブミット・ハンドラを使用してサブミット後に値を変更すると、jQueryは新しい値ではなく元の値を検証します。

+3

私はこの問題を解決しました。私は、jQueryドキュメント・レディ・ハンドラの中にサブミット・ハンドラを持っていました。私はそれを削除した後、私は望むように提出前にフォームの提出を操作することができました。 – Mark

+0

上記のコメントで混乱している人は、ドキュメントハンドラから送信ハンドラを移動してフォームのすぐ下に置く必要があります。 – Stijn

答えて

8

検証後にサブミットハンドラが実行されません。それは前に実行されます。それを試してみてください。

$('form').submit(function() { 
    alert('validation hasn\'t run yet at this point => see there is no red color over your form input fields yet'); 

    if ($(this).valid()) { 
     alert('the form is valid'); 
    } else { 
     alert('the form is not valid'); 
    } 
}); 

UPDATE:私はまだ問題を再現することができません

改訂質問の後。ここに私のモデルです:

public class MyModel 
{ 
    [Required] 
    public string Name { get; set; } 
} 

、ここで私の見解です:私は空白の名前フィールドを残して、フォームを送信した場合、新しい値が適切に割り当てられている今、

@model MyModel 

<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>   

@using (Html.BeginForm(null, null, FormMethod.Post, new { })) 
{ 
    @Html.EditorFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
    <input type="submit" value="OK" /> 
} 

<script type="text/javascript"> 
    $('form').submit(function() { 
     $('#Name').val('some value'); 
    }); 
</script> 

、フォームが正常に送信されますエラーのないサーバー。新しい値を割り当てた$('#Name').val('some value');行を削除し、空のフィールドでフォームを送信しようとすると、クライアント側の検証がトリガーされ、フォームは送信されません。

+1

バリデーター(onsubmitを実行するように設定した場合)はsubmit時に実行されます。私が間違っていない場合は、貼り付けたコードは、送信イベントの添付順に応じて前または後で実行されます。また、サイドノートとして、jqueryを使用してイベントをバインドしている間は、順序が保証されます(例のように)。 –

+0

お返事ありがとうございました。私の改訂された質問をご覧ください。 – Mark

+0

@マークS.、私も私の答えを更新しました。 –

0

私はそれが解決策になるかはわからないが、あなたはIClientValidatableインタフェースにhttp://msdn.microsoft.com/en-us/library/system.web.mvc.iclientvalidatable(v=vs.98).aspx

を見ている可能性がここでの例では、(かなり古い)ですが、現在のリリースで動作するはずです: ASP.NET MVC ASP.NET MVC 3プレビューでValidatePasswordLengthAttributeにクライアント側の検証を追加するhttp://blogs.msdn.com/b/stuartleeks/archive/2010/07/28/asp-net-mvc-adding-client-side-validation-to-validatepasswordlengthattribute-in-asp-net-mvc-3-preview-1.aspx

関連する問題