您的位置:首页 > 其它

SharePoint工程中用Response生成Excel以后页面按钮失效问题

2011-11-03 11:10 295 查看
在按钮事件中添加属性:OnClientClick="_spFormOnSubmitCalled=false“ 即可。

<asp:Button ID="Searsh" runat="server" Text="Search" Width="50px" OnClientClick="_spFormOnSubmitCalled=false"

onclick="Searsh_Click" />

一共收集了四种解决方案不知道哪些方案在你的工程中适用:

1 在 page_load 里加上如下代码:

string beforeSubmitJS = “\nvar exportRequested = false; \n”;

beforeSubmitJS += “var beforeFormSubmitFunction = theForm.onsubmit;\n”;

beforeSubmitJS += “theForm.onsubmit = function(){ \n”;

beforeSubmitJS += “var returnVal = beforeFormSubmitFunction(); \n”;

beforeSubmitJS += “if(exportRequested && returnVal) {_spFormOnSubmitCalled=false; exportRequested=false;} \n”;

beforeSubmitJS += “return returnVal; \n”;

beforeSubmitJS += “}; \n”;

this.Page.ClientScript.RegisterStartupScript(this.GetType(), “alterFormSubmitEvent”, beforeSubmitJS, true);

注册javascript程序,然后再按钮提交时发送一个参数:

this._btnSubmit.Attributes["onclick"] = “javascript:exportRequested=true;”;

使用这种方法有两个问题需要注意:(1)如果你的导出按键是写在UserControl里面那么 上面的方法会报错,因为RegisterClientScriptBlock将代码注册到源文件后面,用RegisterStartupScript的话,由于theForm.onsubmit 没有声明,会报错。(2)生成的excel文件如果选择”打开”,是很正常的;选择“保存”,页面上的所有脚本失效,前题还必须是target为_self错误信息为“未知错误“。个人分析认为这个是生成的页面虽然弹出打开,但设置的setHeader已经默认为excel文件格式,这个引响到了IE调用JS的方式(猜测),现在解决的方法为将target设为_blank,不过结果是会多一个白色的页面。

2 (1)原来的导出按钮增加 OnClientClick事件。

btnExport.OnClientClick = “return AutoForm_Export(‘PostBackEventTarget_IsExport’);”;

(2)客户端增加javascript函数AutoForm_Export。

function AutoForm_Export(postBackEventTarget)

{

WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(postBackEventTarget, “”, true, “”, “”, false, true)) ;

return false;

}

(3)在服务器端根据Request["__EVENTTARGET"] 来判断是否是导出事件。注意下面红色字体的注释

if (Page.Request["__EVENTTARGET"] != null)

{

bool isInAsyncPostBack = false;

ScriptManager sm = ScriptManager.GetCurrent(Page);

if (sm != null)

{

isInAsyncPostBack = sm.IsInAsyncPostBack;

}

if (isInAsyncPostBack )

{

/*

一定要进行判断是否是使用Axaj进行异步请求,否则在点击导出按钮以后,再进行其它Ajax请求, Page.Request["__EVENTTARGET"] 会保留原来的值,这样就错误判断了。

*/

_isExport = false

}

else

{

string postBackEventTarget = Page.Request["__EVENTTARGET"].ToString();

if (postBackEventTarget == “PostBackEventTarget_IsExport”)

{

_isExport = true;

}

else

_isExport = false;

}

}

else

_isExport = false;

}

//我不知道这个” _isExport”变量是什么作用

3 这种方法比较简单明了,但它却有它的局限性,只能用在服务器端的按钮事件中(我个人觉得是适用在有OnClientClick事件的服务器控件上)所有按钮上加上一个客户端事件:OnClientClick=”_spFormOnSubmitCalled=false;”。

4 在Page_Load中注册两行Javascript脚本,string script = “_spOriginalFormAction = document.forms[0].action;\n_spSuppressFormOnSubmitWrapper = true;”;

this.ClientScript.RegisterClientScriptBlock(this.GetType(), “script”, script, true);

可能是受其它因素的影响吧,只有第四种方法奏效。其它方法期待你的验证!

(Visited 19 times, 1 visits today)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐