2014-10-07 194 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