Возврат Json вызывает диалог сохранения файла в asp.net mvc - PullRequest
3 голосов
/ 26 мая 2010

Я интегрирую jquery fullcalendar в свое приложение. Вот код, который я использую:

в index.aspx:

<script type="text/javascript">
   $(document).ready(function() {
       $('#calendar').fullCalendar({
           events: "/Scheduler/CalendarData"
       });
   });  
</script>

<div id="calendar">
</div>

Вот код для Планировщика / CalendarData:

public ActionResult CalendarData()
    {

        IList<CalendarDTO> tasksList = new List<CalendarDTO>();

        tasksList.Add(new CalendarDTO
        {
            id = 1,
            title = "Google search",
            start = ToUnixTimespan(DateTime.Now),
            end = ToUnixTimespan(DateTime.Now.AddHours(4)),
            url = "www.google.com"
        });
        tasksList.Add(new CalendarDTO
        {
            id = 1,
            title = "Bing search",
            start = ToUnixTimespan(DateTime.Now.AddDays(1)),
            end = ToUnixTimespan(DateTime.Now.AddDays(1).AddHours(4)),
            url = "www.bing.com"
        });

        return Json(tasksList,JsonRequestBehavior.AllowGet);
    }

    private long ToUnixTimespan(DateTime date)
    {
        TimeSpan tspan = date.ToUniversalTime().Subtract(
        new DateTime(1970, 1, 1, 0, 0, 0));

        return (long)Math.Truncate(tspan.TotalSeconds);
    }

    public ActionResult Index()
    {
        return View("Index");
    }

У меня также есть следующий код внутри тега head на сайте site.master:

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
<link href="<%= Url.Content("~/Content/jquery-ui-1.7.2.custom.css") %>" rel="stylesheet" type="text/css" />
<link href="~Perspectiva/Content/Site.css" rel="stylesheet" type="text/css" />
<link href="~Perspectiva/Content/fullcalendar.css" rel="stylesheet" type="text/css" />
<script src="~Perspectiva/Scripts/jquery-1.4.2.js" type="text/javascript"></script>
<script src="~Perspectiva/Scripts/fullcalendar.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftAjax.debug.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.debug.js" type="text/javascript"></script>

Все, что я сделал, было скопировано с http://szahariev.blogspot.com/2009/08/jquery-fullcalendar-and-aspnet-mvc.html

При переходе к / scheduler / calendardata я получаю приглашение сохранить данные json, содержимое которых в точности соответствует тому, что я создал в функции CalendarData.

Что мне нужно сделать, чтобы правильно отобразить страницу?

Заранее спасибо,

Эран

Обновление: После комментариев Руны и Франси я добавил представление с именем CalendarData.aspx, идентичное index.aspx. Результаты:

  • Навигация в / планировщик / календарь по-прежнему дает мне диалог сохранения файла.
  • Навигация в / планировщик / индекс, который я получаю следующая ошибка во время выполнения в Visual Studio: среда выполнения Microsoft JScript ошибка: объект ожидается. В.С. подчеркивает $ (Документ) .ready (функция () ...) код в теге скрипта.

Ответы [ 6 ]

1 голос
/ 19 июля 2010

Попробуйте использовать JSonResult вместо ActionResult.

public JSonResult CalendarData()
{
    IList<CalendarDTO> tasksList = new List<CalendarDTO>();

    tasksList.Add(new CalendarDTO
    {
        id = 1,
        title = "Google search",
        start = ToUnixTimespan(DateTime.Now),
        end = ToUnixTimespan(DateTime.Now.AddHours(4)),
        url = "www.google.com"
    });
    tasksList.Add(new CalendarDTO
    {
        id = 1,
        title = "Bing search",
        start = ToUnixTimespan(DateTime.Now.AddDays(1)),
        end = ToUnixTimespan(DateTime.Now.AddDays(1).AddHours(4)),
        url = "www.bing.com"
    });

    return Json(tasksList, JsonRequestBehavior.AllowGet);
}
0 голосов
/ 18 марта 2013

Единственный способ заставить это работать, не заставляя конечного пользователя проходить через сумасшедшие вещи, это изменить тип содержимого на «text / html» в ответе.

Я перепробовал все вышеизложенные предложения, а также несколько других.

Черт, я даже пытался это .

0 голосов
/ 09 июля 2010

У меня была такая же проблема, и мне не хватало базового ActionResult, который возвращал View для начала ...? Я думал, что это что-то более глубокое ... но вот основные вещи, которые нужно проверить, чтобы исправить мою проблему;

в моем Homecontroller;

public ActionResult Index()
    {
        ViewData["Message"] = "Whatever!!! just work!";

        return View();
    }

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

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
0 голосов
/ 03 июля 2010

Попробуйте использовать JSonResult вместо ActionResult.

0 голосов
/ 27 мая 2010

Если вы перейдете к /scheduler/calendarData в браузере, браузер получит ответ с Content-Type: application/json. Некоторые браузеры не знают, как отображать такой тип контента, поэтому позволяют сохранять контент как локальный файл, чтобы вы могли просматривать его в другой программе.

Вместо этого вы должны перейти к своему браузеру на /scheduler/index, который возвращает читабельный результат, который может быть представлен всеми браузерами (имеет Content-Type: text/html).

Если вы хотите просмотреть содержимое, возвращаемое CalendarData для целей отладки, у вас есть два варианта:

  • используйте браузер, который понимает Content-Type: application/json
  • используйте инструмент, подобный Fiddler , который позволяет вам проверять трафик HTTP
0 голосов
/ 27 мая 2010

Необходимо перейти к URL-адресу, сопоставленному с действием, возвращающим Index.aspx, вместо URL-адреса, сопоставленного с CalendarData (). Я предполагаю, что это будет что-то вроде "/ планировщик". Когда вы переходите в «/ scheduler / calenderData», сервер возвращает данные Json прямо в браузер.

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