【问题标题】:Return Json causes save file dialog in asp.net mvc返回 Json 导致在 asp.net mvc 中保存文件对话框
【发布时间】:2010-05-26 19:59:59
【问题描述】:

我正在将 jquery fullcalendar 集成到我的应用程序中。 这是我正在使用的代码:

在 index.aspx 中:

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

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

这是 Scheduler/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");
    }

我在 site.master 的 head 标签内也有以下代码:

<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 函数中创建的内容。

我需要做什么才能正确呈现页面?

提前致谢,

伊兰

更新: 在 Rune 和 Franci 的 cmets 之后,我添加了一个名为 CalendarData.aspx 的视图,它与 index.aspx 相同。结果:

  • 导航到 /scheduler/calendardata 仍然给我保存文件对话框。
  • 导航到 /scheduler/index 我得到 Visual中的以下运行时错误 Studio:Microsoft JScript 运行时 错误:预期对象。 VS 突出了 $(document).ready(function()...) 脚本标签中的代码。

【问题讨论】:

  • 如果您没有更改任何其他内容,添加 CalendarData.aspx 视图不会更改任何内容,因为没有任何操作返回该视图。您在导航到 /scheduler/index 时看到的可能是正确的页面,但其中包含 javascript 错误。看来您的 ASP.NET MVC 内容(视图和操作)现在是正确的,但是 javascript 存在问题。尝试使用 FireFox 或 Chrome 访问 /scheduler/index 并进一步调查 js 错误,可能使用 FireFox 的 FireBug-plugin
  • 你解决过这个问题吗?我现在遇到了这个问题,似乎无法克服它。
  • 我已经有一段时间没有接触过这段代码了,但是如果我没记错的话,解决方案是将所有指向 css 和 js 文件的链接放在 aspx 文件而不是母版页中,并使用 Url .Content() 对它们进行编码。希望这会有所帮助!

标签: jquery asp.net asp.net-mvc json fullcalendar


【解决方案1】:

尝试使用 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);
}

【讨论】:

    【解决方案2】:

    您需要导航到映射到返回 Index.aspx 的操作的 URL,而不是映射到 CalendarData() 的 URL。我认为这将类似于“/调度程序”。当您转到“/scheduler/calenderData”时,服务器会将 Json 数据直接返回给浏览器。

    【讨论】:

      【解决方案3】:

      如果您在浏览器中导航到/scheduler/calendarData,浏览器会收到带有Content-Type: application/json 的响应。有些浏览器不知道如何显示这种内容类型,所以它们允许您将内容保存为本地文件,以便您可以在其他程序中查看。

      您应该将浏览器导航到 /scheduler/index,这会返回一个可供所有浏览器呈现的人类可读结果(具有 Content-Type: text/html)。

      如果你想查看CalendarData返回的内容进行调试,你有两种选择:

      • 使用能理解Content-Type: application/json的浏览器
      • 使用Fiddler 之类的工具来检查 HTTP 流量

      【讨论】:

        【解决方案4】:

        尝试使用 JSonResult 而不是 ActionResult。

        【讨论】:

          【解决方案5】:

          我有同样的问题,我错过了返回视图的基本 ActionResult 以开始......?我在想这是更深层次的东西......但这是解决我的问题的基本检查事项;

          在我的家庭控制器中;

          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
          );
          

          【讨论】:

            【解决方案6】:

            在不让最终用户经历疯狂的事情的情况下,我让它工作的唯一方法是在返回时将内容类型更改为“text/html”。

            我已经尝试了上述所有建议,以及其他一些建议。

            哎呀,我什至试过this

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多