AJAX验证理念 - 完成ValidationSummary& ValidationMessage

时间:2009-05-21 13:04:49

标签: jquery html asp.net-mvc jquery-validate xval

我一直在研究许多ASP.Net MVC客户端验证思路,包括xVal。目前这还没有提供ValidationSummary所以我选择做一个AJAX帖子,它循环传递ModelState错误并在成功的AJAX帖子上用错误消息更新DIV。

问题是这些字段旁边的ValidationMessage *不会被填充。我想出了另一个我尚未测试过的想法,因为我不知道完整的语法让它工作但我想我会看到你们的想法。

我认为可能存在的一个问题是当你在控制器中发布你的编辑/创建动作方法而你想要返回一个JSON对象时,我不确定这是合法的,因为JSON用于GET动作仅

如果您认为这是一个好主意并希望提供帮助,请留下答案和任何代码片段以使其正常工作。如果你认为它是一个头发脑力计划,可以做得更好,请让我知道如何。

控制器:

if (!ModelState.IsValid)
{
            var err = ModelState.Where(f => f.Value.Errors.Count > 0);    
            if (Request.IsAjaxRequest())
            {
                   return this.Json(err);
            }
            else
            {
                  return View(PostedItem); 
            }
}

查看:

    $(function() {



    $('#createForm').ajaxForm({
        success:fillSummary
    });

    //click events
    $('#btnSave').click( function(){
        $('#createForm').submit();
    });

    function fillSummary(data) 
    {
       //Loop through the modelstate errors returned
        $.each(data)
       {
            //Append Summary DIV with error message
            //Look for span with the ModelState key name and set it to visible
       }           
    }



    <div id="summary">
       <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.")%>
    </div>
    <form action="<%=Url.Action("Create") %>" method="post" id="createForm">

        <fieldset>
            <div>
                 <label for="Title">Title:</label>
                <%= Html.TextBox("Title",Model.Title) %>
                <%= Html.ValidationMessage("Title", "*") %>
                <span id="val_Title" style="display:none">*</span>              
            </div>
   </form>
   <input type="button" value="Save" id="btnSave" />

1 个答案:

答案 0 :(得分:1)

在我目前的ASP.NET MVC项目中,我有很多POST操作,我用于AJAX并且也遇到了验证问题。我所做的是创建一个包装器对象,从这些看起来像这样的动作返回...

public class JsonWrapper
{
   public object Data { get; set; }
   public bool IsError { get; set; }
   public string Message { get; set; }
}

如果操作中的验证没有任何类型的错误,我会在Data属性中放置我想要返回的任何数据。但是,如果存在任何类型的验证错误或其他异常,我将IsError标志设置为true并在Message属性中设置错误消息。然后在操作结束时,我将对象序列化为JSON并返回它(是的,你可以通过POST操作执行此操作)...

return Json(myJsonWrapper);

从客户端,在我的AJAX POST代码的onSuccess中,我检查错误,并采取任何必要的操作...(注意,在代码的这一点,从服务器返回的对象已经被jQuery反序列化为JS对象

function onSuccess(jsonWrapper) {
    if (!jsonWrapper.IsError) {
        var myDataFromAction = jsonWrapper.Data;
        //Do stuff with my data
    }
    else {
        MessageBox.ShowMessage(jsonWrapper.Message);
    }
}

这不适合您的场景开箱即用,但您可以做一些与概念类似的事情。希望这至少能给你一些想法。