代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

ASP.NET MVC中的jQuery Ajax响应

  •  5
  • Chaddeus  · 技术社区  · 15 年前

    甚至不确定这是不是正确的标题问题。我知道我的Ajax调用都错了…下面是我正在做的(顺便说一下,我正在使用ASP.NET MVC后端):

    我用 jQuery.ajax 将一些数据发布到某个操作,该操作将加载我在响应中捕获的视图。它基本上是为一个动作提供一些数据,并收回一些HTML。

    假设我想创建一个经过验证的Ajax调用。出错时如何返回验证消息?例如,一个Ajax登录表单。如果用户无法验证,我想告诉他们…而不是什么都不做。

    对于这个幼稚的问题,我很抱歉,我只是不知道如何用词来正确地在谷歌上找到解决方案。

    提前谢谢!

    4 回复  |  直到 14 年前
        1
  •  7
  •   RaYell    15 年前

    首先,如果您希望Ajax调用返回您计划在脚本中使用的数据(并且通过使用,我指的是比在 div ,您可能应该从服务器返回JSON数据而不是HTML。JSON实际上是一个JS对象,因此它可以在收到JS时在JS中使用。

    因此,如果您返回数据,即

    {id: 1, status: 'ok'}
    

    您可以使用类似这样的数据来使用该数据。

    $.ajax({
        url: "your/script/url",
        type: "POST",
        data: {login : 'foo', pass: 'bar'}, // whatever the data is
        dataType: "json",
        success: function(data){
            if (data.status === 'ok') {
                console.log('success');
            } else {
                console.log('error');
            }
        }
    

    (});

        2
  •  5
  •   womp    15 年前

    您将需要返回多条信息以进行响应。幸运的是,使用JSON可以很容易地做到这一点,如果您告诉jquery响应类型是json,它将自动为您处理它。进入Ajax回调函数的对象将包含作为不同属性所需的所有数据。

    我建议养成在每次Ajax调用中返回“成功”或“失败”状态代码以及错误集合的习惯。 See this awesome blog post 关于我的意思的更多信息。

    原因是,除非服务器实际上无法处理请求并返回失败的HTTP状态代码,否则Ajax调用将始终从根本上“成功”。如果请求的结果类似于验证错误,但是服务器仍然返回某种文本响应,那么即使应用程序操作失败,Ajax调用仍然被认为是成功的。

    因此,如果在操作方法中,不是在操作结果中返回HTML数据,而是返回这样的对象:

    public class AjaxResponse
        {
            /// <summary>
            /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
            /// This creates an AjaxResponse that by default indicates SUCCESS.
            /// </summary>
            public AjaxResponse()
            {
                Success = true;
                Data = new List<object>();
            }
    
            /// <summary>
            /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
            /// This creates an AjaxResponse that indicates FAILURE.
            /// </summary>
            /// <param name="exception">The exception.</param>
            public AjaxResponse(Exception exception)
                : this()
            {
                Success = false;
                Errors = new [] { exception.Message };
            }
    
            /// <summary>
            /// Initializes a new instance of the <see cref="AjaxResponse"/> class.
            /// This creates an AjaxResponse that indicates SUCCESS.
            /// </summary>
            /// <param name="data">The data.</param>
            public AjaxResponse(object data)
                : this()
            {
                Data = data;
            }
    
            /// <summary>
            /// Gets or sets a value indicating whether this <see cref="AjaxResponse"/> is success.
            /// </summary>
            /// <value><c>true</c> if success; otherwise, <c>false</c>.</value>
            public bool Success
            {
                get; set;
            }
    
            /// <summary>
            /// Gets or sets the data.
            /// </summary>
            /// <value>The data.</value>
            public object Data
            {
                get; set;
            }
    
            /// <summary>
            /// Gets or sets the errors.
            /// </summary>
            /// <value>The errors.</value>
            public string[] Errors
            {
                get; set;
            }
        }
    

    这将转换为具有属性“.success”、“.data”和“.errors”的javascript对象。

    因此,如果验证代码已经用所有验证错误填充了错误数组,那么Ajax回调函数很容易

    1. 确定调用的预期目的失败,因为success属性设置为“failure”。

    2. 得到 全部的 相关的错误字符串。

    在您的操作方法中,使用这种模式可以很容易地做到这一点:

        try
        {
            instance.Validate();
            return Json(new AjaxResponse(myHtmlData));
        }
        catch(Exception ex)
        {
            var response = new AjaxResponse(ex);
    
            // Get your validation errors here, put them into
            // your ajax response's Errors property.
    
            return Json(response);
        }
    
        3
  •  2
  •   Robert Koritnik    14 年前

    我已经 blogged about this same situation .也许它也会在你的情况下帮助你。它基本上是关于拥有一个自定义的异常类和一个异常操作属性来返回错误。所以你可以使用 success error 选项 $.ajax 打电话。我认为这是正确的做法。

    阿贾克斯 调用提供了处理成功和错误响应的功能。不需要总是返回一个设置了错误标志的成功,您必须检查客户端。

        4
  •  0
  •   Juri    15 年前

    我不确定我是否完全理解你的意思。但是,您的错误验证消息示例不会像下面那样工作:

    1. 用户点击某个按钮/链接,不管是什么导致了一个动作。
    2. 一个异步的日志被发送回服务器,传输用户ID(您应该知道这里的安全性)。
    3. 在服务器上,完成必要的验证,并返回响应(在XML、JSON中,直接将消息编码为HTML)
    4. 回到客户端,您可以在JavaScript代码中得到响应,并将其适当地放在页面上。

    希望有帮助。