[英]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.Success
, result.RedirectTo
和result.Messages
。 如果需要将公司对象序列化,则有两种选择:
JsonResult
没有成功,重定向和消息信息,仅依赖于HTTP状态代码。 这将涉及更改操作方法,如果您在javascript中使用成功,重定向和消息数据,则该方法将无效。 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.