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