サムネイルとダウンロードアイコン(ImageButton)を表示するDatalistコントロールがあり、DatalistはUpdatePanelでラップされています。ユーザーがダウンロードアイコンをクリックすると、次の関数を呼び出して、ユーザー側でファイルをダウンロードできるようにします。
protected void dtlSearchDetails_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "dtlImgDownload")
{
downloadFile(e.CommandArgument.ToString(), "~/uploads/primary/");
}
}
働き :
public void downloadFile(string fileName, string filePath)
{
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", fileName));
Response.WriteFile(filePath + fileName);
}
ImageButton
/Datalist
が内側にラップUpdatePanel
されているので、ポストバックコントロールとして登録しましたScriptManager
。Page_Load
if (dtlSearchDetails.Items.Count > 0)
{
foreach (DataListItem li in dtlSearchDetails.Items)
{
ImageButton img = (ImageButton)li.FindControl("dtlImgDownload");
ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(img);
}
}
ダウンロードアイコンをクリックしても何も起こらず、コンソールで次のエラーが発生します。
Uncaught Sys.WebForms.PageRequestManagerParserErrorException:Sys.WebForms.PageRequestManagerParserErrorException:サーバーから受信したメッセージを解析できませんでした。このエラーの一般的な原因は、Response.Write()の呼び出しによって応答が変更された場合、応答フィルター、HttpModules、またはサーバートレースが有効になっている場合です。
だが、
このUpdatePanelの外にある検索ボタンのような他のコントロールが同じページにありますが、私はそれらをとして登録しました
<trigger>
<asp:AsyncPostBackTrigger ControlID="btnKeySearch" />
</trigger>
同じupdatePanel内。
この検索ボタンをクリックしてからダウンロードアイコンをクリックすると、コンソールでエラーが発生することなく、期待どおりに完全に正常に動作します(クライアントでファイルをダウンロードします)。
この回避策の背後にある原因を見つけることができません。
親切に私を助けてください。