2012-12-30 44 views
-1

我有一個ASP.NET MVC 4,我使用客戶端和服務器端驗證與驗證屬性。使用javascript將驗證錯誤添加到現有表單中?

形式將這樣用Ajax發送之前進行適當的驗證:

function ValidateFormAndAjaxSubmit(formId, callingElement) { 

    if (IsNotDblClick(callingElement.id)) { 
     var _form = $("#" + formId); 

     var validator = _form.validate(); 
     var anyError = false; 

     _form.find("input").each(function() { 
      if (!validator.element(this)) { // validate every input element inside this step 
       anyError = true; 
      } 
     }); 

     if (anyError) { 
      window.latestClick = ''; 
      return false; // exit if any error found  
     } 

     $.post(_form.attr("action"), _form.serialize(), function (data) { 

      if (data.Success) { 

      } 
      else { 

      } 

      alert("Win"); 
      window.latestClick = ''; 
      //check the result and do whatever you want 
     }) 
    } 
} 

的形式如下:

@using (Html.BeginForm("JEdit", "Post", FormMethod.Post, new { id = "frmEditPost" })) 
{ 
    @Html.ValidationSummary(true) 
    ... 
} 

將會爲額外的驗證在服務器端,這是存儲在這樣的返回類:

public class JEditResult 
    { 
     public Boolean Success = false; 
     public string TitleErrMessage; 
     public string TextErrMessage; 
     public string LinkErrMessage; 
     public string TagErrMessage; 
     public string OtherErrMessage; 
    } 

現在我需要把這些驗證成表格,就好像在客戶端驗證了一樣。我該怎麼做呢?

+0

您是否正在使用模型綁定,並將驗證屬性添加到模型中?您可能不想擁有自己的結果類,就像您使用JEditResult創建的一樣。看起來您正在複製內置於MVC的功能。你能發佈你的模型和你的動作方法的代碼嗎? –

+0

擺脫所有輸入循環業務,並使用[有效()](http://docs.jquery.com/Plugins/Validation/valid)。此外,僅供參考 - 它是「服務器」而不是「服務」 - 就像網絡服務器一樣。得到它? –

+0

@ jesus.tesh謝謝,這工作正常,但如何處理返回驗證的主要問題尚未解決。 – Ivy

回答

1

我用下面的擴展方法:

public static JsonResult JsonValidation(this ModelStateDictionary state, JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet) { 
    var result = new JsonResult { 
     Data = new { 
      success = false, 
      Tag = "ValidationError", 
      State = from e in state 
        where e.Value.Errors.Count > 0 
        select new { 
         Name = e.Key, 
         Errors = (e.Value.Errors.Select(x => x.ErrorMessage) 
          .Concat(e.Value.Errors.Where(x => x.Exception != null).Select(x => x.Exception.Message))) 
          .Where(x => !String.IsNullOrEmpty(x)).Select(x => x) 
        } 
     } 
    }; 
    result.JsonRequestBehavior = behavior; 
    return result; 
} 

然後我的代碼中使用它,像這樣:

if (ModelState.IsValid == false) { 
    Response.StatusCode = 400; 
    return ModelState.JsonValidation(); 
} 

我也有一些標準的JS代碼我使用:

// JSON validation 
function validateResponse(form, response) { 
    var data = getResponseValidationObject(response); 
    if (!data) return true; 

    var validator = form.validate(); 
    var container = form.find("[data-valmsg-summary=true]"); 
    var list = container.find("ul"); 
    if (!list) return; 

    container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); 
    list.empty().show(); 
    $.each(data.State, function (i, item) { 
     list.append("<li>" + item.Errors.join("</li><li>") + "</li>"); 
    }); 
    return false; 
} 

// JSON validation 
function getResponseValidationObject(response) { 
    if (response && response.Tag && response.Tag == "ValidationError") 
     return response; 
    return null; 
} 

然後在我的ajax文章中,我檢查了有效性的回覆回覆:

var json = $.parseJSON(response.responseText); 
var isValid = validateResponse($("#form"), json); 
// Do something here... 

validateResponse函數會自動爲表單驗證摘要(假設有一個)添加錯誤。

+0

這看起來像我尋找的解決方案!工作很好。我會試試 – Ivy

+0

謝謝。 :)它工作得很好,我相信它也會爲你效勞。 –

+0

我發現我的代碼有問題,內部後期功能不會被觸發,因爲我們將StatusCode設置爲400(我認爲)我該如何處理?我可以忽略StatusCode嗎?或者有一個錯誤的jQuery.post函數? – Ivy