【问题标题】:Jquery Ajax - Return Bool?Jquery Ajax - 返回布尔值?
【发布时间】:2013-09-06 07:49:27
【问题描述】:

新手问题,试图找出是否已发送电子邮件并显示结果,似乎无法正常工作。

function SendPreview() {
    var value = CKEDITOR.instances['Source'].getData();
    alert(value);
    var model = { EmailBody: value.toString(), EmailTo: $("#SendTo").val(), EmailSubject: $("#Subject").val() };
    var request = $.ajax({
        url: '/Campaign/SendPreviewEmail',
        async: false,
        type: 'POST',
        dataType: 'JSON',
        data: { model: JSON.stringify(model) },
        cache: false,
        success: function (data) {
            if (data) {
                alert("Message Sent");
            } else {
                alert("Message Not Sent, Please check details");
            }
        }
    });
}
[HttpPost]
[ValidateInput(false)]
public bool SendPreviewEmail(string model)
{
    var e = new EmailPreview();
    JavaScriptSerializer objJavascript = new JavaScriptSerializer();

    e = objJavascript.Deserialize<EmailPreview>(model);
    if (!string.IsNullOrEmpty(e.EmailTo) && !string.IsNullOrEmpty(e.EmailSubject) && !string.IsNullOrEmpty(e.EmailBody))
    {
        if (IsValidEmail(e.EmailTo))
        {
            _mailService.SendMail(account.Email, e.EmailTo, e.EmailSubject, e.EmailBody, true);
            return true;
        }
    }
    return false;
}

【问题讨论】:

  • 这将始终执行此(数据)检查。您可能想使用xhr.responseText == "something" 之类的东西来检查条件。
  • 此时代码会发生什么?
  • 不要使用async: false 如果您的服务器无法响应,它将锁定浏览器 - 不仅仅是网页,而是整个浏览器及其菜单和一切。在某些浏览器中,它会锁定每个浏览器窗口,而不仅仅是您的页面所在的那个。不要这样做。相反,以适当的方式处理 ajax 调用的异步特性,在回调函数中采取任何需要的操作。
  • 抱歉,问题是我需要返回 bool 然后显示正确的信息

标签: jquery asp.net-mvc


【解决方案1】:

假设这是 ASP.Net MVC,您应该从您的操作中返回一个 ActionResult(或至少从它派生的一些东西)。下一个问题是返回true 将意味着toString() 将在bool 值上被调用,从而产生字符串"True""False"。请注意,这两个都等同于 javascript 中的 true。相反,返回包含结果标志的 JSON。

在 jQuery 代码中,您还设置了 async: false,这确实是一种不好的做法。事实上,如果您检查控制台,您会看到浏览器对其使用的警告。您应该删除该属性,以便异步发出 AJAX 请求。您还在ajax() 调用中将dataType 设置为JSON,但实际上返回的是一个字符串。试试这个:

function SendPreview() {
    var value = CKEDITOR.instances['Source'].getData();
    var model = { EmailBody: value.toString(), EmailTo: $("#SendTo").val(), EmailSubject: $("#Subject").val() };
    var request = $.ajax({
        url: '/Campaign/SendPreviewEmail',
        type: 'POST',
        dataType: 'JSON',
        data: { model: JSON.stringify(model) },
        cache: false,
        success: function (data) {
            if (data.emailSent) { // note the object parameter has changed
                alert("Message Sent");
            } else {
                alert("Message Not Sent, Please check details");
            }
        }
    });
}
[HttpPost]
[ValidateInput(false)]
public ActionResult SendPreviewEmail(string model)
{
    var e = new EmailPreview();
    var result = false;
    JavaScriptSerializer objJavascript = new JavaScriptSerializer();

    e = objJavascript.Deserialize<EmailPreview>(model);
    if (!string.IsNullOrEmpty(e.EmailTo) && !string.IsNullOrEmpty(e.EmailSubject) && !string.IsNullOrEmpty(e.EmailBody))
    {
        if (IsValidEmail(e.EmailTo))
        {
            _mailService.SendMail(account.Email, e.EmailTo, e.EmailSubject, e.EmailBody, true);
            result = true;
        }
    }
    return Json(new { emailSent = result });
}

【讨论】:

  • 没有提到MVC
  • Jquery AJAX 是一样的,不管是 ASP MVC 还是 PHP。无论如何,这是一个非常好的答案......
【解决方案2】:

其实return不会给浏览器发回任何东西,你得写数据才能发回浏览器,大概是Response.Write,对这个不太熟悉。

同样,在客户端

if (data)

对于任何数据都是一样的,如果有任何数据发送回浏览器,它将评估为true,因此需要检查实际数据,可能是这样的

if (data == 1)

或者,对于json,它可能是

if (data.success) // if you send a json response.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2011-12-14
    • 2020-07-29
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多