如何在不通过无效回邮的情况下从隐藏字段中继器中获取值

本文关键字:隐藏 情况下 字段 中继器 获取 无效 | 更新日期: 2023-09-27 18:07:23

我试图使用内联pdf浏览器,但当我调用代码时,它显示以下错误

invvalid回发或回调参数。使用配置中或<%@启用事件验证页面中的页面EnableEventValidation="true"%>。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且预期有效,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

我看到,在大多数表单上,它建议不要禁用上述功能,并使用RegisterForEventValidation,但我的问题是,如果在中继器内的按钮,我应该如何启用。我已经尝试了以下操作,但它没有干扰我的按钮方法

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation(btnViewDocumentBrowser_Click);
    base.Render(writer);
}

这是在浏览器中呈现pdf的代码,它导致了上述异常

protected void btnDownloadDocument_Click(object sender, EventArgs e)
{
    HiddenField hf = (HiddenField)rptDocumentsProposal.FindControl("currentFileName");
    if (hf != null)
    {
        string filename = hf.Value.ToString();
        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attach;filename=" + filename);
        Response.TransmitFile(filename);
        Response.End();
    }
}

中继器代码

<asp:Repeater ID="rptDocumentsProposal" runat="server">
    <ItemTemplate>
        <div class="col-md-6 sidesthick">
            <div class="windowbox">
                <div class="pull-left">
                    <h2><asp:Label runat="server" Text='<%# Eval("documentTitle") %>' /></h2>
                </div>
                <div class="pull-right icon-doc">
                    <asp:Label ID="IconDocument" runat="server" />
                </div>
                <div style="clear: both"></div>
                <div>
                    <p>
                        Name:
                        <asp:Label runat="server" Text='<%# Eval("documentTitle") %>' />
                        <br /> Description:
                        <asp:Label runat="server" Text='<%# Eval("documentDescription") %>' />
                        <br /> Type:
                        <asp:Label ID="lblType" runat="server" Text='<%# Eval("type") %>' />
                        <asp:HiddenField ID="currentFileName" Value='<%# DataBinder.Eval(Container.DataItem, "serverPath") %>' runat="server" />
                        <br />
                    </p>
                </div>
                <div class="center">
                    <asp:Button ID="btnDownloadDocument" CssClass="btn btn-default" OnClick="btnDownloadDocument_Click" runat="server" Text="Download Document" />
                    <asp:Button ID="btnViewDocumentBrowser" CommandArgument='<%# Eval("serverPath") %>' CssClass="btn btn-default" OnClick="btnViewDocumentBrowser_Click" runat="server" Text="View In Browser" />
                </div>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

导致问题的比特似乎是HiddenField,当我试图找到它时,它没有找到正确的文件名,即使在中继器中填充了一个文件名

如何在不通过无效回邮的情况下从隐藏字段中继器中获取值

你不能像那样简单地在Repeater中获取项目,你需要这样做:

foreach (RepeaterItem item in rptDocumentsProposal.Items)
{
    var hf = (HiddenField)item.FindControl("currentFileName");
    // now you access to hf.Value
    // btw please you hfCurrentFileName instead of just currentFileName as your HiddenField name :)
}

因此,这是为了寻找HiddenField问题。

对于Button's click,我建议使用Repeater's OnItemCommand event而不是Button's OnClick event。使用OnItemCommand非常容易,并且可以分离normal used Buttonsinside Repeater used ButtonsOnClick event(希望您能理解(。

所以,这是代码:

您需要将OnItemCommand添加到中继器,如下所示:

<asp:Repeater ID="rptDocumentsProposal" runat="server"
    OnItemCommand="rptDocumentsProposal_ItemCommand">

还有CommandName&CommandArgumentButton,如下所示:

<asp:Button ID="btnDownloadDocument" runat="server"
    CommandArgument='<%# Eval("SOME_VALUE") %>' CommandName="Download" />

最后C#

protected void rptDocumentsProposal_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandArgument == null)
        return;
    // I prefer to use switch/case here to handle more Buttons click easily
    // feel free to use if/else instead of switch/case
    switch (e.CommandName)
    {
        case "Download":
            // deal with the Button click here
            break;
        default:
            // hello !!, there is nothing to do with
            break;
    }
}

顺便说一句,当我试图用JS更改ASP controls值并将其发送回服务器时,我收到了您提到的错误。

我在你的共享代码中没有看到这样的东西,所以我认为你会用这种方式获胜:(

尝试这个解决方案(如果您喜欢,请(并报告结果。