2014-10-07 3 views
0

Вот мой AJAX запрос:AJAX сообщение запроса не возвращает 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); 
    } 
}); 

А вот контроллер он бьет:

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

Что я делаю неправильно?

EDIT: Моя цель состоит в том, чтобы вернуть возвращаемые данные результата, представленные в форме. Пример: Метод

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

Можете ли вы привести пример того, что вы хотели бы получить в результате данные json? – elolos

+0

@elolos Я внес некоторые изменения в свой оригинальный пост. Надеюсь, это сделает его более понятным. – mdk09

+0

Спасибо, это разъясняет, чего вы пытаетесь достичь. Можете ли вы также опубликовать исходный код метода 'AjaxJsonResult.SuccessResult()'? – elolos

ответ

1

Объект JSON доступны JavaScript может иметь только те же свойства, что и объект сериализации контроллером. Поэтому, если вы вернете AjaxJsonResult, у вас будет только доступ к result.Success, result.RedirectTo и result.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

Смежные вопросы