我有一个主“报告”页面,其中包含用户可以采取的一些操作,这些操作将打开模式RadWindow,让用户执行操作,然后单击“保存”,模式窗口将关闭,主网格将刷新。
这在IE和Firefox中都运行良好,但Chrome可以完成所有“工作”,但模态页面保持打开状态。仅当我点击“保存”按钮时才会出现这种情况;表单顶部的取消按钮和关闭按钮仍然可以正常工作。
这是子窗口中的JavaScript:
<script type="text/javascript">
function GetRadWindow() {
var oWindow = null;
if (window.radWindow)
oWindow = window.radWindow;
else if (window.frameElement.radWindow)
oWindow = window.frameElement.radWindow;
return oWindow;
}
function CloseRadWindow() {
var oWnd = GetRadWindow()
oWnd.SetUrl("");
oWnd.close();
}
function CloseAndRebind(args) {
var oWnd = GetRadWindow()
oWnd.BrowserWindow.refreshGrid(args);
oWnd.SetUrl("");
oWnd.close();
}
</script>
这是父的refreshgrid函数:
<script type="text/javascript">
function refreshGrid(arg) {
if (!arg) {
$find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>").ajaxRequest("Rebind");
}
else {
$find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>").ajaxRequest("RebindAndNavigate");
}
}
</script>
父级通过运行:
加载模态窗口 protected void btnSplitInvoice_Click(object sender, EventArgs e)
{
var btn = sender as Button;
var item = (GridDataItem)btn.Parent.Parent;
long id = long.Parse(item["Id"].Text);
var itemType = this.TabStrip1.SelectedIndex == 0 ? "TransferOrderInvoice" : "EquipmentInvoice";
string scriptstring = "var oWindow=radopen('../Misc/SplitInvoice.aspx?id=" + id + "&type=" + itemType + "','SplitInvoice');oWindow.SetModal(true);";
ScriptManager.RegisterStartupScript(this, this.GetType(), "openwindow", scriptstring, true);
}
孩子的保存按钮在后面的代码中完成了很多工作,然后完成了这个:
ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "mykey", "CloseAndRebind('navigateToInserted');", true);
取消按钮设置如下:
<button type="button" class="CancelBtn" value="" onclick="CloseRadWindow()">
</button>
我发现一段时间内的一个条目建议在结束时添加window.open('', '_self', '');
,但这似乎不适用(当我测试它时它也不起作用)。
编辑:在控制台打开的情况下运行Chrome时,我确实看到我在refreshgrid
运行时在主页面上收到错误:
Cannot call method 'ajaxRequest' of null
但不确定是否是造成问题的原因。现在更多地展望它。
EDIT2:所以问题似乎是在使用Chrome时,主页面中的RadAjaxManager似乎在refreshGrid
运行时找不到,这就是上面出现空错误的原因。我能够通过用document.location.reload();
替换refreshGrid函数的内容来“修复”问题,并且它没问题。如果我可以提供帮助,我宁愿不重新加载整个页面,所以想知道是否还有办法解决这个问题。而且我很好奇为什么IE和Firefox似乎在Chrome没有处理时会这样做?
更多可能有用的信息:主页的Page_Load事件:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.Session["AllUserLocationValue"] = string.Empty;
this.InitializeThePage();
}
RadAjaxManager manager = RadAjaxManager.GetCurrent(this.Page);
manager.AjaxRequest += this.manager_AjaxRequest;
manager.AjaxSettings.AddAjaxSetting(manager, this.pnlHeading, this.RadAjaxLoadingPanel1);
manager.AjaxSettings.AddAjaxSetting(manager, this.RadCodeBlock1, this.RadAjaxLoadingPanel1);
}
答案 0 :(得分:1)
删除对SetUrl(“”)的调用,因为它开始处理当前页面,如果浏览器足够快,它将无法调用close()。
如果你需要远离RadWindow,你可以使用这三个选项中的一个
将其ReloadOnShow属性设置为true。通常与ShowContentDuringLoad = false
将DestroyOnClose设置为true。请谨慎使用,并在close()
使用OnClientClose事件将网址设置为空白页
答案 1 :(得分:1)
好的,我发现Chrome确实“丢失”了报告页面的母版页引用,或者至少RadAjaxManager
,而Firefox和IE则没有(我可以追踪并查看$ find for the two它们)。
然而,我所发现的是,Chrome(以及其他两个)可以始终如一地找到报告的主网格(这是refreshGrid
最终要查找的内容)。所以我能够将refreshGrid
的内容替换为:
function refreshGrid(arg) {
var radgridNotApproved = $find("<%= rgNotApproved.ClientID %>").get_masterTableView();
radgridNotApproved.rebind();
}
并获得我正在寻找的行为。它也更干净; refreshGrid
的原始版本看起来原本打算做的不仅仅是重新绑定网格,但是当我看到它时,这就是它真正做的一切。