手动调用MVC 3客户端validationajax职位

我正在创build一个MVC 3 Web应用程序。 我想在我的实体类上使用Data Annotations,然后在发送回服务器之前使用不显眼的客户端validation。 这在正常发帖时工作正常。 如果任何字段无效,我会得到validation和validation摘要。 不过,我想通过ajax和json发回信息。 我该如何手动validation客户端的表单,然后将我的ajax回发到服务器。 以下是我的代码的摘要版本。

public class Customer { [Required(ErrorMessage = "The customer's first name is required.")] public string FirstName { get; set; } [Required(ErrorMessage = "The customer's last name is required.")] public string LastName { get; set; } } <% using (Html.BeginForm()) { %> <%: Html.LabelFor(model => model.FirstName, "First Name")%> <%: Html.TextBoxFor(model => model.FirstName, new { @class = "TextBox", id = "Customer.FirstName" })%> <%: Html.ValidationMessageFor(model => model.FirstName, "*")%> <%: Html.LabelFor(model => model.LastName, "Last Name")%> <%: Html.TextBoxFor(model => model.LastName, new { @class = "TextBox", id = "Customer.LastName" })%> <%: Html.ValidationMessageFor(model => model.LastName, "*")%> <div id="CustomerEditSave" class="Button CustomerEditButtons" style="margin-right:40px;"> <a href="#">Save</a> </div> <%: Html.ValidationSummary(true) %> <% } %> 

我已经试过这个代码,但它只validation名字,不显示validation摘要。

  $("#CustomerEditSave").click(function () { $(form).validate(); //Ajax call here }); 

尝试:

 //using the form as the jQuery selector (recommended) $('form').submit(function(evt) { evt.preventDefault(); var $form = $(this); if($form.valid()) { //Ajax call here } }); //using the click event on the submit button $('#buttonId').click(function(evt) { evt.preventDefault(); var $form = $('form'); if($form.valid()) { //Ajax call here } }); 

这应该与jQuery的Ajax和MSAjax调用。 也可以尝试使用http://nuget.org/packages/TakeCommand.js或https://github.com/webadvanced/takeCommand它会自动处理这个给你。;

我几天来一直在使用MVC客户端validation:

不要使用.click使用.submit:

 $("#MyForm").submit(function () { if($("#MyForm").valid()) { //Do ajax stuff } //Return false regardless of validation to stop form submitting //prior to ajax doing its thing return false; }); 

我要添加一个更新,考虑取消事件,而不是返回false(或两者兼有):

 $("#MyForm").submit(function (e) { if($("#MyForm").valid()) { //Do ajax stuff } e.preventDefault(); //Return false regardless of validation to stop form submitting //prior to ajax doing its thing return false; }); 

至less在我的情况下(MVC 5),也有必要添加下面的代码否则.valid()将始终返回true:

 $(function () { $(document).ajaxComplete(function(event, request, settings){ //re-parse the DOM after Ajax to enable client validation for any new form fields that have it enabled $.validator.unobtrusive.parse(document); }); 

});

http://johnculviner.com/the-unobtrusive-libraries-client-validation-on-ajax-in-asp-net-mvc-3/

重要!!:

保罗的解决scheme是对这个问题的正确答案,而不是罗伯特博士。

虽然你可以使用valid()而不是validate()。form()。

但更重要的是,没有理由限制您的代码由罗伯特博士build议,即不.click和只使用.submit。 那不是什么解决了问题! 什么解决了这个问题是在if语句中包装$ .ajax(…)调用。 即:

 if($("#MyForm").valid()) { //call to $.ajax or equivalent goes in here. } 

我认为,需要澄清,否则真正的问题的答案是混淆。

$(YourForm)。数据( 'unobtrusiveValidation')。validation()

  if(!$('#myform').data('unobtrusiveValidation').validate()) { // add your extra custom logic } else { $('#myform').submit(); } 

它触发validation并返回一个布尔值,所以你可以在提交之前检查。

.Valid()的作品。 即它会告诉你你的表格是否有效。 无论如何,它无法正确显示和隐藏消息。 这是我的手动validation方法

 function validate() { //valid() not only tells us whether the form is valid but //also ensures that errors are shown !!! if ($("form").valid()) { //if the form is valid we may need to hide previously displayed messages $(".validation-summary-errors").css("display", "none"); $(".input-validation-error").removeClass("input-validation-error"); return true; } else { //the form is not valide and because we are doing this all manually we also have to //show the validation summary manually $(".validation-summary-errors").css("display", "block"); return false; } } 
 I tried all of the above solutions but none worked on MVC5. 

我正在使用jQuery v2.1.4和jQuery.Validation v1.11.1。 我需要在页面呈现时触发validation。 只有在下面一个为我工作。

 $(document).ready(function () { ... validateForm(); } function validateForm() {`enter code here` var elem = document.getElementById('btnSave'); elem.click(); } $('#btnSave').click(function (evt) { //evt.preventDefault(); var form = $('form'); if (form.valid()) { //Ajax call here } //$(".validation-summary-errors").css("display", "block"); }); function Validate() { // If no group name provided the whole page gets validated Page_ClientValidate(); }