繁体   English   中英

AJAX发布请求未返回JSON数据

[英]AJAX Post Request Not Returning JSON Data

这是我的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);
    }
});

这是它要命中的控制器:

[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对象只能具有与控制器序列化的对象相同的属性。 所以,如果你返回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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM