C# 如果服务器没有两个完整的页面呈现,如何将WebForms页面加载到iframe中?

C# 如果服务器没有两个完整的页面呈现,如何将WebForms页面加载到iframe中?,c#,jquery,asp.net,ajax,iframe,C#,Jquery,Asp.net,Ajax,Iframe,我有一种shell页面,其中包含过滤器控件和用于显示gridview的iframe。单击“筛选器”按钮或启动计时器时,将从筛选器控件收集筛选器数据,并将其输入查询字符串到gridview iframe,如图所示: var URL = "/mypage/gridview.aspx"; var dest = URL + '?' + getFilterData(); var frame = $('#gridiframe'); $.ajax({ type: "HEAD", async:

我有一种shell页面,其中包含过滤器控件和用于显示gridview的iframe。单击“筛选器”按钮或启动计时器时,将从筛选器控件收集筛选器数据,并将其输入查询字符串到gridview iframe,如图所示:

var URL = "/mypage/gridview.aspx";
var dest = URL + '?' + getFilterData();
var frame = $('#gridiframe');
$.ajax({
    type: "HEAD",
    async: true,
    url: dest
}).success(function () {
    frame.attr('src', dest);
})
.error(loadError);
我的难题是:gridview的渲染成本非常高。它执行一次巨大的数据库访问,这种方法导致页面呈现两次。第一次,客户机只是查看头部,以确保用户经过身份验证(如果会话超时,页面返回HTTP unauthorized),并且所有参数的格式都良好。但我不想更改iframe源以显示错误消息,我只想调用loadError,它基本上只是通知用户出了什么问题

是否可以使用客户端代码在服务器的一次交换中填充iframe


编辑:谢谢大家的意见。归根结底,我讨厌网络表单。故事结束。

不要在ajax查询中查询iframe的源URL,而是查询不运行相同DB查询的其他端点。您说过它可以做两件事,一是验证用户的登录令牌是否仍然有效,二是验证过滤器参数是否有效。这两个验证步骤都不需要在获得完整查询结果的数据库上运行查询。因此,创建一个执行基本验证的新API端点,如果该端点返回一条成功消息,则将iframe源设置为所需

另一个选项是从gridview.aspx返回HTML片段,而不是完整的HTML页面。如果成功,AJAX可以用HTML结果替换div的内容,而不是设置iframe src,同时仍然允许您处理错误


一个更时髦的选择(不是说它是好是坏,但肯定更符合当前的web开发行业)是将gridview.aspx更改为以简化json返回数据的web服务/api,然后使用javascript框架,或者使用模板引擎在客户端本身上生成html表。

也许我过于简化了,但是您不能在第二个请求中使用QueryString参数吗

$.ajax({
    type: "HEAD",
    async: true,
    url: dest
}).success(function () {
    frame.attr('src', dest + '&getGrid=true');
})
然后在aspx页面上检查查询字符串是否存在

protected void Page_Load(object sender, EventArgs e)
{
    //validate user always

    if (Request.QueryString["getGrid"] != null)
    {
        //rebuild grid 
    }
}

您可以使用普通的
而不是iFrame,只从另一个页面加载gridView,如下所示:

首先,将gridView包装在另一个页面中的容器周围 差不多

然后使用如下AJAX代码仅检索网格:

var URL = "/mypage/gridview.aspx";
var dest = URL + '?' + getFilterData();
var div = $('#divId');
$.ajax({
    type: "HEAD",
    async: true,
    url: dest
}).success(function (res) {
    div.html($('#grid-wrapper',$(res)).html); //this gets only the contents of grid-wrapper and not the whole page.
})

是的,但我绝不会建议你这么做。。首先,这相当困难,您必须执行一些时髦的编码/json/hidden元素来在另一个视图中加载视图,然后解析它,然后将值插入iframe,非常难看。但是,真正做到这一点,将创建依赖关系和增加维护,对于我所考虑的,几乎没有好处。@ ErkkpIPS由GRIDVIEW页面运行的查询可能需要几秒钟的时间运行,并且这个页面以一个一分钟的间隔被一天一次访问,即使不是数以千计的客户。即使它很难看,将我们的数据库负载减半也是一个显著的好处。因此,您真正的问题是查询/数据库。相反,我建议加快数据库/查询/索引或开始缓存值。通过Ajax加载速度不会明显加快,实际上会影响iframe父级的初始加载时间。db命中率是一个难点,但它已经达到了预期的优化程度。查询是动态生成的,必须访问10个左右相当大的表。根据权限级别、帐户成员资格、身份和搜索条件,每个用户的查询和结果都不同。无法缓存结果的数量和种类。在后端进行数周的优化不会产生25%的改进,而如果这个客户端问题能够得到解决,那么页面响应时间将提高50%,数据库负载将降低50%。相信我,我问的是一个真正的问题,而不是“解决方案”。嗯,一些好的想法。关于第一个问题,页面目前主要通过运行完整的DB查询和呈现gridview来执行验证。但我可以在webmethod中做一些更轻量级的验证和验证。关于第二个,我认为这不可行,因为我依赖于gridview.aspx.cs中的页面生命周期事件和事件处理程序。关于你的最后一个建议,我明白了,但是我们没有足够的开发资源来重写页面,句号。这太简单了,因为查询字符串变量也需要验证。用户不太可能需要验证,因为页面的其他地方有一个保持活动的iframe。通常,预计可能出错的是过滤器参数。谢谢你的输入。我不是说发送所有的过滤器参数
getGrid
仅用于确保在第一次调用url时网格和繁重的sql查询不会运行。hmmmm。是的,一开始我确实误读了你的答案。这似乎不像Ziv的答案那样是一个理想的模式,但它可能更容易实现。第一,你不能重复使用div。第二,我需要webforms页面/控件生命周期事件,它们不会从中触发。是的,这是真的。此方法仅适用于必须加载静态内容或可由简单JS处理的内容的情况。