javascript - AJAX Post 请求不返回 JSON 数据

标签 javascript jquery asp.net ajax asp.net-mvc

这是我的 AJAX 请求:

var data = modalDom.find("form").serializeObject();
data["returnJson"] = true;

$.ajax({
    type: "POST",
    url: "/companies/edit/",
    data: data,
    dataType: "JSON",
    success: function (result) {
        modalDom.modal('hide');

        var dropdown = $("#create-modal #CompanyID");
        var currentSelected = dropdown.find("option:selected");
        if (currentSelected.length) {
            currentSelected.removeAttr("selected");
        }

        var newOption = '<option value="' + result.company.CompanyID + '">' + result.company.Name + '</option>';
        dropdown.append(newOption);
        dropdown.val(result.company.CompanyID);
    }
});

这是它所击中的 Controller :

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Company company) {
    if (CurrentUser.IsCompany(User)) {
        return AjaxJsonResult.AuthFailResult();
    }

    if (!ModelState.IsValid) {
        return AjaxJsonResult.FailResult(ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage).ToList());
    }

    db.Company_CompanyType.RemoveRange(db.Company_CompanyType.Where(c => c.CompanyID == company.CompanyID));
    if (Request.Params["CompanyTypes[]"] != null) {
        var companyTypes = (from item in Request.Params["CompanyTypes[]"].Split(new[] {','})
            select db.CompanyTypes.FirstOrDefault(c => c.Name == item)
            into ct
            where ct != null
            select new Company_CompanyType() {
                CompanyID = company.CompanyID, CompanyTypeID = ct.CompanyTypeID
            }).ToList();

        db.Company_CompanyType.AddRange(companyTypes);
    }

    if (company.CompanyID <= 0) {
        db.Companies.Add(company);
    }
    else {
        db.Entry(company).State = EntityState.Modified;
    }

    db.SaveChanges();

    return AjaxJsonResult.SuccessResult("?companyID=" + company.CompanyID);
}

我无法通过结果变量访问 JSON 对象的任何属性。当我记录在控制台中传递的数据时,它是表单中的正确数据。当在控制台中记录结果变量时,我得到:

Object {Success: true, RedirectTo: "?companyID=9818", Messages: null}

我做错了什么?

编辑:我的目标是让结果对象返回从表单提交的数据。示例:

result.company.CompanyID = 1988
result.company.Name = "My Company Name"

AjaxJsonResult.SuccessResult()方法的源代码:

public class AjaxJsonResult {
    public bool Success { get; set; }
    public string RedirectTo { get; set; }
    public List<string> Messages { get; set; }

    public static JsonResult SuccessResult(string redirectTo) {
        var result = new AjaxJsonResult {
            Success = true,
            RedirectTo = redirectTo,
            Messages = null
        };
        return ToJsonResult(result);
    }

    public static JsonResult ToJsonResult(AjaxJsonResult result, JsonRequestBehavior behavior = JsonRequestBehavior.AllowGet) {
        return new JsonResult() {
            Data = result,
            ContentType = (string) null,
            ContentEncoding = (Encoding) null,
            JsonRequestBehavior = behavior
        };
    }
}

最佳答案

JavaScript可用的json对象只能具有与 Controller 序列化的对象相同的属性。因此,如果您返回 AjaxJsonResult,您将只能访问 result.Successresult.RedirectToresult.Messages.如果您需要序列化公司对象,您有两种选择:

  1. 返回一个普通的 JsonResult ,没有成功、重定向和消息信息,并且仅依赖于 http 状态代码。这将涉及更改操作方法,如果您在 JavaScript 中使用成功、重定向和消息数据,则该方法将不起作用。
  2. 更新 AjaxJsonResult,使其具有额外的属性来存储内容,并在 SuccessResult 方法中传递该属性。它可以是 Company 类的强类型,也可以是普通对象。

这是一个例子:

 public static JsonResult SuccessResult(string redirectTo, object data) 
 {
     var result = new AjaxJsonResult 
     {
         Data = data,
         Success = true,
         RedirectTo = redirectTo,
         Messages = null
     };
     return ToJsonResult(result);
 }

然后你必须在方法中传递对象,如下所示:

return AjaxJsonResult.SuccessResult("?companyID=" + company.CompanyID, new {company});

然后,您将能够在 JavaScript 中访问对象的属性,但您必须注意使用适当的大小写,并添加新的 Data 属性。如果执行此操作,您将能够通过输入 result.Data.company.CompanyID

获取公司 ID

关于javascript - AJAX Post 请求不返回 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26239781/

相关文章:

c# - 设置 ASP.net 成员(member)资格和 MySQL 数据库的问题

html - 对齐 ASP.NET Texbox 控件

javascript - 从 HTML 创建数组

javascript - JS 按钮的 CSS 适用于本地计算机,但不适用于服务器

jQuery img 交换 - 保持宽度和高度

javascript - Jquery/JS - 如何切换 :after, :befor of an element?

javascript - 为什么 Ruby 包含在内?函数无法按 AngularJS 变量的预期工作?

javascript - Yii2:用按钮调用javascript函数

jquery - 如何制作一个像 fadeIn 这样不将元素作为参数的函数

ASP.NET 2.5 前缀 ctl00 和 ASP.NET 4 不前缀 ctl00