ASP.NET MVC, возвращающий объекты JSON из моделей представления - PullRequest
0 голосов
/ 18 января 2010

В последнее время кажется, что все, о чем я когда-либо пишу, - это ASP.NET MVC с JSON. Однако происходят странные вещи, которые я не могу объяснить!

У меня есть метод Controller, который возвращает JsonResult:

public JsonResult GetAllUserTasksForStage(int StageID, string Username)
{
    var uM = ManagerProvider.GetUserManager();
    var tM = ManagerProvider.GetTaskManager();
    var tasks = tM.GetAllUserTasks(StageID, uM.GetUser(Username).ID);
    // GetAllUserTasks returns IEnumerable<TaskViewModel>
    // Encode this into Json and return it
    return Json(tasks, JsonRequestBehavior.AllowGet);
}

Этот метод завершается успешно, однако, когда дело доходит до получения этого в моем View, возникают проблемы. Я попытался использовать как $ .post (...), так и $ .getJSON (...) - для $ .post () я удалил JsonRequestBehavior из метода Controller.

Чтение документации jQuery Я видел, что функции обратного вызова как в $ .post, так и в $ .getJSON запускаются только в том случае, если результат является допустимым JSON - что наводит меня на мысль, что что-то не так с возвращенным результатом GetAllUserTasksForStage.

Класс TaskViewModel определяется как:

public class TaskViewModel
{
    public int ID { get; set; }
    public UserViewModel Assignee { get; set; }
    public DateTime Created { get; set; }
    public UserViewModel Creator { get; set; }
    public DateTime Due { get; set; }
    public string TaskDescription { get; set; }
    public string TaskTitle { get; set; }
    public bool Completed { get; set; }
    public StageViewModel Stage { get; set; }
    public IEnumerable<TaskAuditViewModel> TaskAudits { get; set; }
}

Это меня полностью озадачило, поскольку я несколько раз без проблем использовал $ .post и $ .getJSON в одном и том же View, но никогда не возвращал TaskViewModel.

Есть идеи?

Спасибо

Chris

Ответы [ 3 ]

0 голосов
/ 23 февраля 2010

Попробуйте вызвать метод Json напрямую из URL браузера (пропуская часть jQuery) и посмотрите, что вы получите. Я предполагаю, что у вас, вероятно, есть что-то вроде вызова jQuery ajax в этом действии. Так что попробуйте позвонить прямо. Обычно это показывает простое сообщение об ошибке.

0 голосов
/ 06 января 2012

Ваша модель сложная (в ней есть другие модели).

У меня нет фактов, но кажется, что функция Json в MVC имеет проблемы с передачей сложных моделей в часть JQuery. Если вы проверите результат действия mvc (F9 на линии, где находится Json), вы увидите, что Json отображает сложную модель по частям, таким как: base, Model1, Mode2, ...

Когда это происходит, Json возвращает сопоставленный результат, но каким-то образом часть jQuery клинета не может его понять, ошибки нет, но данные не могут быть использованы на клиенте.

Я пытался найти решение, но пока не нашел. Я пробовал несколько таких комбинаций, как вы (.post, .get, .ajax ... JsonResult и т. Д. И т. Д.). К сожалению, похоже, что работает только один способ - вернуть (из действия) результат, созданный вручную Json, как этот:

[HttpPost]
        public ActionResult GetOrderDetail(int id)
        {
            var orderDetail = orderService.GetOrderDetail(id);

            var result = Json(new
            {
                ItemDescription = orderDetail.ItemDescription,
                ItemUrl = orderDetail.ItemUrl
            });

            return result;
        }

В этом случае моя модель OrderDetail содержит две другие модели: Order, OrderMessages и имеет ту же проблему, что вы описали. При сопоставлении свойства вручную со свойством, как показано здесь, оно работает.

0 голосов
/ 03 февраля 2010

Я бы порекомендовал немного решить проблему. Слишком много всего происходит. Сначала попробуйте вернуть простой объект JSON. Это позволит вам убедиться в правильности JavaScript / транспорта. Затем попробуйте медленно представить ваш объект в качестве возвращаемого типа. Таким образом, вы сможете определить, где JSON является недействительным.

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