回发触发问题

时间:2011-04-22 09:41:00

标签: asp.net gridview triggers updatepanel postback

我有一个gridview,我在其中显示从Database获取的文件名。我已将文件名作为gridview中的链接按钮。

<asp:GridView ID="gdvMainList" runat="server" CssClass="Grid" 
AutoGenerateColumns="False" DataSourceID="dtsFilesUploaded" 
AllowPaging="True" DataKeyNames="Id" SkinID="PagedGridView" AllowSorting="True" 
onrowediting="gdvMainList_RowEditing" OnRowDataBound="gdvMainList_RowDataBound"                                                     onrowupdating="gdvMainList_RowUpdating" onrowcommand="gdvMainList_RowCommand">                                                    
<Columns>

<asp:TemplateField HeaderText="File Name" SortExpression="FileName">
<ItemTemplate>
<asp:LinkButton ID="lbFileName" runat="server" Text='<%# Bind("FileName") %>' OnClick="OpenFile" CausesValidation="false"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Uploaded On" SortExpression="CreatedDateTime">
<ItemTemplate>
<asp:Label ID="lblCreatedDate" runat="server" Text='<%# Bind("CreatedDateTime") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category" SortExpression="glCategoryId">
<ItemTemplate>
<asp:Label ID="lblglCategoryId" runat="server" Text='<%# Bind("GeneralLookup.LookupItem") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlglCategoryId" runat="server" CssClass="textEntry2" DataSourceID="dtsglCategoryId"                                                            DataTextField="LookupItem" DataValueField="Id" AppendDataBoundItems="true" Width="120px">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<asp:BoundField DataField="CreatedBy" HeaderText="Created By" Visible="false" />
</Columns>
</asp:GridView>

链接按钮的方法是Onclick =“OpenFile”,Open文件的代码是:

protected void OpenFile(object sender, EventArgs e)
    {
        LinkButton btn = (LinkButton)sender;
        string fileName = btn.Attributes["FileName"].ToString();

        //string path = Server.MapPath(".") + "\\Files\\" + fileName;
        string path = Server.MapPath("~") + "Upload\\" + this.fileUpload.FileName;
        if (File.Exists(path))
        {
            Response.AppendHeader("content-disposition", "filename=" + fileName);
            string type = "Application/word";
            if (type != "")
                Response.ContentType = type;
            Response.WriteFile(path);
            Response.End();
        }
        else
        {
        }   
    }

现在问题是,此代码在更新面板中不起作用,并且在没有更新面板的情况下工作得很好。这就是我试图添加这些行来回发帖子的原因。

<Triggers>
     <asp:PostBackTrigger ControlID="btnFileUploadSave" />
     <asp:PostBackTrigger ControlID="lbFileName" />

Control Id btnFileUploadSave是我文件中用于上传文件的另一个图像按钮。因为没有这个,更新面板中也无法上传文件。

无论如何,当我运行此代码时,会发生以下异常:

Server Error in '/' Application.

在UpdatePanel'updownAttachFile'中找不到ID为“lbFileName”的控件。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.InvalidOperationException:在UpdatePanel'updAttachFile'中找不到触发器ID为“btnOpenFile”的控件。

如果有人可以,请帮忙。在这方面,我浪费了一倍的时间。

这是我的aspx页面的GUI:

enter image description here

2 个答案:

答案 0 :(得分:0)

您无法将ItemTemplate中的控件定义为UpdatePanel触发器。

要获得解决方案,请检查this。基本上你必须在OnItemDataBound事件中将控件注册为触发器。

另一个解决方案可能是AsyncFileUpload,它不需要完整的回发工作。

编辑:修复了第一个链接。

答案 1 :(得分:0)

我找到了另一种选择。我在单击链接按钮时使用window.open()打开一个新页面。这解决了这个问题。