2014-10-07 268 views
0

这里是我的AJAX请求:AJAX POST请求不返回JSON数据

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

这里是它的击球控制器:我无法访问我的JSON对象的任何属性

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

通过结果变量。当我记录我在控制台传递的数据时,它是来自表单的正确数据。当在控制台中记录结果变量时,我得到:

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 
     }; 
    } 
} 
+0

得到公司ID你能举一个你想要结果json数据看起来像什么样子的例子吗? – elolos 2014-10-07 15:36:04

+0

@elolos我对原始文章进行了一些编辑。希望这可以让我们更清楚一点。 – mdk09 2014-10-07 15:42:56

+0

谢谢,这澄清了你试图达到的目标。你能否也请发布'AjaxJsonResult.SuccessResult()'方法的源代码? – elolos 2014-10-07 15:49:43

回答

1

将JSON可用于JavaScript只能有相同的性质由控制器序列化的对象的对象。因此,如果您退回AjaxJsonResult,则只能访问result.Successresult.RedirectToresult.Messages。如果您需要本公司对象序列化,你有两个选择:

  1. 返回平原JsonResult没有成功,重定向和消息的信息,只是依赖于HTTP状态码。这将涉及更改操作方法,如果您在javascript中使用成功,重定向和消息数据,则它将不起作用。
  2. 更新AjaxJsonResult,因此它有一个额外的属性来存储内容,并通过SuccessResult方法。它可以强类型为公司类或它可以是一个普通的对象。

下面是一个例子:

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

+0

第二个选项完美运作。谢谢! – mdk09 2014-10-07 16:57:42