1

サムネイルとダウンロードアイコン(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されているので、ポストバックコントロールとして登録しましたScriptManagerPage_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内。

この検索ボタンをクリックしてからダウンロードアイコンをクリックすると、コンソールでエラーが発生することなく、期待どおりに完全に正常に動作します(クライアントでファイルをダウンロードします)。

この回避策の背後にある原因を見つけることができません。

親切に私を助けてください。

4

1 に答える 1

2

あなたImageButtonは内部にいるDataListので、あなたはあなたのイベントのRegisterPostBackControl内部をしなければなりません。DataListItemDataBound

protected void dtlSearchDetails_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var imgBtn = e.Item.FindControl("dtlImgDownload") as ImageButton;
        ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(imgBtn);
        // your other code goes here.
    }
}
于 2012-05-30T05:47:13.013 に答える