【问题标题】:AJAX Validation Idea - Complete with ValidationSummary & ValidationMessageAJAX 验证理念 - 包含 ValidationSummary 和 ValidationMessage
【发布时间】:2009-05-21 13:04:49
【问题描述】:

我一直在研究许多 ASP.Net MVC 客户端验证想法,包括 xVal。这目前不提供 ValidationSummary,所以我选择做一个 AJAX 帖子,它遍历 ModelState 错误并使用成功的 AJAX 帖子上的错误消息更新 DIV。

问题是您的 ValidationMessage * 字段旁边不会被填充。我想出了一个我还没有测试过的替代想法,因为我还不知道让它工作的完整语法,但我想我会看看你们的想法。

我认为可能存在的一个问题是,当您发布到控制器中的 Edit/Create Action 方法并想要返回 JSON 对象时,我不确定这是否合法,因为 JSON 用于 GET 操作仅限。

如果您认为这是一个好主意并希望提供帮助,请留下答案和任何代码 sn-ps 以使其正常工作。如果您认为这是一个脑筋急转弯并且可以做得更好的方案,请告诉我如何。

控制器:

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

【问题讨论】:

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


    【解决方案1】:

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

    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);
        }
    }
    

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

    【讨论】:

    • 如果没有错误,那么 MessageBox.ShowMessage 是什么 - 这不是 Windows 窗体吗?如果服务器端没有错误,我假设您继续执行控制器操作并将数据添加到数据库?是否只在出现错误时返回 JSON?不过看起来不错!
    • 我实现了自己的 MessageBox 客户端控件,因此我可以轻松地在页面上显示消息,抱歉造成混淆。 :) 是的,如果没有任何错误,控制器操作会做它应该做的任何事情,我会在 Data 属性中将任何有趣的信息发送回客户端,也许是一个 db 的记录 ID例如插入。当客户端期望对 AJAX POST 操作的响应时,我总是将 JSON JsonWrapper 对象传递回客户端。这允许在客户端使用通用 API。请注意,任何对象都可以在“数据”中传回,这具有很大的灵活性。
    • 我已经开始实现它,但我遇到了 JSON 问题。当我尝试将数据附加到 DIV 时,它什么也不做。我已经发出警报,数据以正确的格式返回,所以我不确定。这就是我所拥有的: function showJSON(errors) { $("#summary").empty(); $.each(errors, function(i, error){ $("#summary").append(error.Text); }); }
    • 好吧,如果没有看到您的服务器端和客户端代码,很难帮助解决这个问题。我建议使用 javascript 调试器来检查您从服务器返回的对象并从该角度对其进行攻击。此外,像 firebug 或 IE8 的开发工具这样的 DOM 检查器可能会帮助您查看您的 javascript 对页面所做的事情,从而了解问题所在。
    • 不用担心,AJAX 帖子未设置为返回 JSON 数据。通过返回 ModelState Key 名称和错误集合,我设法让这一切正常工作。然后,我遍历 OnSuccess 事件上的错误并将其放入验证摘要 div 中,并在字段旁边查找跨度并将它们设置为可见。我认为各种酷,但由于缺乏回复,我想没有人这么认为!谢谢
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 2019-04-13
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多