jQuery.Load()不会在ASP.NET MVC2中触发Request.IsAjaxRequest

时间:2010-08-17 10:38:02

标签: asp.net-mvc ajax jquery fullcalendar

我正在使用Jquery完整的日历插件,我希望能够点击一个事件,并通过AJAX将事件的详细信息填充到id为#details的div中。

这是我正在尝试加载的控制器操作。调试时,操作不会将传入请求视为AJAX并返回完整视图而不是部分视图。如果将完整视图调用与局部视图相同,这是否重要?即; 'Details.aspx'& 'Details.ascx'?

public ActionResult Details(int id)
    {
        Pol_Event pol_Event = eventRepo.GetEvent(id);
        ViewData["EventTypes"] = et.GetEventType(id);
        if (pol_Event == null)
            return View("NotFound");
        else
        {
            if(HttpContext.Request.IsAjaxRequest()){
                return PartialView("Details");
            }
            else
                return View(pol_Event);

        }
    }

这是我正在使用的jquery代码。我错过了在eventClick函数中没有正确使用.load()吗?日历插件的开发者已确认eventClick与AJAX无关,因此错误必须在我的代码中。

$(document).ready(function() {
            $('#calendar').fullCalendar({

                header: {
                    left: 'prev,next today',
                    center: 'title',
                    right: 'month,agendaWeek,agendaDay'
                },

                events: "/Events/CalendarData",
                allDayDefault: false,

                selectable: true,
                eventClick: function(event) {
                    $('details').load(event.url);
                },
                eventRender: function(event, element) {
                    element.qtip({
                        content: event.title + " @ " + event.venue,

                        position: {
                            corner: {
                                target: 'topLeft',
                                tooltip: 'bottomLeft'
                            }
                        }

                    });
                }


            });

        });

所以我错误地使用了Jquery.Load()函数,或者我的控制器出了什么问题?

更多更新:我终于发现了这个问题。 XMLHttpRequest正在发送,但我遇到500内部服务器错误,尚未解决,因为我无法弄清楚是什么导致错误。

Host: localhost:4296
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 
Firefox/3.6.8
Accept: text/html, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://localhost:4296/Events/EventCalendar
Cookie: .ASPXAUTH=56C5F4FD536564FF684F3F00E9FB51A5F2F1B22D566C517923D71FEAF599D266531CAC52BF49D2700E048DD420A4575456855303CC2DCB5875D4E1AD8883821EA62E5169969503776C78EB3685DAA48C

更新:我终于弄明白了问题所在。我没有将模型传递给部分所以行

return PartialView("Details");

应该是

return PartialView("Details", pol_Event);

这产生了500内部服务错误。

2 个答案:

答案 0 :(得分:5)

当您发出Ajax请求时,您可能会将“ X-Requested-With ”HTTP标头设置为“ XMLHttpRequest ”,例如

Host                www.google.com
User-Agent          Mozilla/5.0 (Windows; U; Windows NT 6.1; (snip...)
Accept              */*
Accept-Language     en-us,en;q=0.5
Accept-Encoding     gzip,deflate
Accept-Charset      ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive          115
Connection          keep-alive
X-Requested-With    XMLHttpRequest
Referer             http://www.google.com

这个'X-Requested-With'标头是'IsAjaxRequest()'方法所寻找的。通常,jQuery的Ajax方法会自动发送此标头。我的猜测是,由于某种原因,jQuery Calendar插件没有发送此标题。

我会下载类似fiddler的内容,或安装Firebug for Firefox并在启动/初始化Ajax请求/日历控件时检查原始HTTP请求/响应数据。查看是否包含X-Requested-With标头。

答案 1 :(得分:3)

是。虽然它不必作为HTTP请求标头发送。您可以在表单数据或GET的查询字符串中发布它。 www.example.com?x-requested-with=XMLHttpRequest(区分大小写)

似乎很荒谬但却是真实的。我已经尝试了它并且它有效:)对IsAjaxRequest()扩展方法的反思将证明这一点:

return ((request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest")));