Возвращение JSON в Action в MVC 3.0 - PullRequest
1 голос
/ 24 июня 2011

Признаюсь, я в замешательстве:

Я пытаюсь вернуть простой объект, который я преобразовал в JSON, следующим образом:

 viewModel.updateCoder = function (coder) {
   var coderJson = ko.toJSON(coder);
   var coderJsonString = ko.utils.stringifyJson(coderJson);
   $.ajax({
     url: "provider/UpdateCoder",
     type: 'POST',
     dataType: 'text',
     data: coderJsonString,
     contentType: 'text/csv',
     success: function () { alert("Updated!"); }
   });

Моя запись в RouteTable выглядит следующим образом:

 routes.MapRoute(
    "UpdateCoder",
      "provider/UpdateCoder/{coderDTO}", // URL with parameters
    new { controller = "Provider", action = "UpdateCoder", coderDTO = UrlParameter.Optional }
    );

Действие моего Контроллера выглядит следующим образом:

[AcceptVerbs(HttpVerbs.Post)]
public string UpdateCoder( string coderDTO )
{
  var rslt = "success";
  //var coder = coderDTO.CoderDTOToCoder();
  return rslt;
}

То, что я получаю в параметре UpdateCoder (строка coderDTO), равно нулю;

Это моя запасная позиция. Я бы скорее отправил объект JSON (coderJson) в действие, но получил ошибку: «Для этого объекта не определен конструктор без параметров». Когда я это делаю, я меняю тип параметра следующим образом:

[AcceptVerbs(HttpVerbs.Post)]
public string UpdateCoder( **CoderDTO coderDTO** )
{
  var rslt = "success";
  //var coder = coderDTO.CoderDTOToCoder();
  return rslt;
}

вместе с: ValueProviderFactories.Factories.Add (new JsonValueProviderFactory ()); в Global.asax

класс CoderDTO выглядит так:

public class CoderDTO
{
    public Int32 Id { get; set; }
    public String CoderCode { get; set; }
    public String Sal { get; set; }
    public String LName { get; set; }
    public String FName { get; set; }
    public String MI { get; set; }
    public String Facility { get; set; }
    public String Title { get; set; }
    public Boolean? IsContract { get; set; }
    public Boolean? IsInactive { get; set; }
    public Boolean? IsDeleted { get; set; }
    public String Comments { get; set; }
    public String AlternateId { get; set; }
    public int CasesCoded { get; set; }

    public CoderDTO(Coder coder)
    {
        Id = coder.Id;
        CoderCode = coder.CoderCode;
        Sal = coder.Sal;
        LName = coder.LName;
        FName = coder.FName;
        MI = coder.MI;
        Facility = coder.Facility;
        Title = coder.Title;
        if (coder.IsContract != null) IsContract = coder.IsContract;
        if (coder.IsInactive != null) IsInactive = coder.IsInactive;
        if (coder.IsDeleted != null) IsDeleted = coder.IsDeleted;
        Comments = coder.Comments;
        AlternateId = coder.AlternateId;
    }

    public Coder CoderDTOToCoder()
    {
        var coder = new Coder
                    {
                        Id = Id,
                        CoderCode = CoderCode,
                        Sal = Sal,
                        LName = LName,
                        FName = FName,
                        MI = MI,
                        Facility = Facility,
                        Title = Title
                    };
        coder.IsContract = IsContract ?? false;
        coder.IsInactive = IsInactive ?? false;
        coder.IsDeleted = IsDeleted ?? false;
        coder.Comments = Comments;
        coder.AlternateId = AlternateId;
        return coder;
    }


}

КодерJsonString выглядит так:

{"Id":201,"CoderCode":"GP ","Sal":null,"LName":null,"FName":null,"MI":null,"IsContract":false,"IsInactive":false,"Comments":null,"CasesCoded":0,"isBeingEdited":false}

Это был долгий день !! Спасибо за любую помощь, я обедаю !!

Ответы [ 3 ]

1 голос
/ 25 июня 2011

Я нашел ответ на вопрос, почему я не могу вернуть JSON, который десериализуется в мой объект CoderDTO: у моего объекта не было открытого конструктора без параметров.У меня был параметр конструктора Coder, который заполнил CoderDTO.Я разделил это на отдельный метод, и теперь это работает.

Благодарю сообщение

StackOverflow - ASP.NET MVC 3 JSONP: это работает с JsonValueProviderFactory?

0 голосов
/ 24 июня 2011

Попробуйте изменить действие, чтобы использовать JsonResult:

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult UpdateCoder(CoderDTO coderDTO)
{
    var rslt = "success";
    //var coder = coderDTO.CoderDTOToCoder();
    return Json(rslt);
}
0 голосов
/ 24 июня 2011

Я думаю, что ваша лучшая ставка - попытаться выяснить, почему вы не можете десериализовать свой DTO.Вам нужно будет по крайней мере добавить конструктор по умолчанию к нему.

public CoderDTO() { }

Для вашей текущей ситуации с передачей строк, я думаю, вы хотели бы назвать его следующим образом:

viewModel.updateCoder = function (coder) {
   var coderJson = ko.toJSON(coder);
   var coderJsonString = ko.utils.stringifyJson({ coderDTO: coderJson });
   $.ajax({
     url: "provider/UpdateCoder",
     type: 'POST',
     dataType: 'text',
     data: coderJsonString,
     contentType: 'application/json; charset=utf-8',
     success: function () { alert("Updated!"); }
   });

Итак, в основном вы создаете объект с именем и значением параметра и переводите его в строку.В этом случае кодер Json имеет двойную кодировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...