作者 ID 未传递到重定向字符串



我有一个文本框,我需要将authorid传递到与所选作者匹配的隐藏字段中。 然后,我需要将该authorID传递给 response.redirect url,以便在单击按钮时打开详细的作者页面,其中包含该作者的传记信息。
下面是我的代码,但它不起作用。
如何让我的按钮工作,以便在每次选择作者姓名时传递正确的作者 ID?

ImageButton btnFindAuthors = sender as ImageButton;
HiddenField myhiddenfield = btnFindAuthors.NamingContainer.FindControl("hiddenID") as HiddenField;
int myID = Convert.ToInt32(myhiddenfield.Value);
Response.Redirect(String.Format("~/Authors_Detail.aspx?id=" + myhiddenfield));

标记:

<asp:TextBox runat="server" ID="txtAuthors" Text='<%# Bind("AuthorName") %>' />
<asp:ImageButton runat="server" ID="btnFindAuthors"  OnClick="btnFindAuthors"/>
<ajaxToolkit:AutoCompleteExtender ID="fndAuthors" runat="server" 
             DelimiterCharacters="" Enabled="True" 
             ServicePath="~/WebServices/AuthorsWebService.asmx" 
             ServiceMethod="AutoComplete"
             TargetControlID="txtAuthors" MinimumPrefixLength="3" />             
<asp:HiddenField ID="hiddenID" runat="server" Value='<%#Eval("AuthorID") %>' />

作者编号:

<asp:SqlDataSource runat="server" ID="sqlAuthors" 
    ConnectionString="<%$ ConnectionStrings:Libros %>" 
    ProviderName="<%$ ConnectionStrings:Libros.ProviderName %>" 
    SelectCommand="SELECT * FROM Authors 
                   WHERE AuthorName LIKE ('%' + @Authorname + '%') 
                   ORDER BY AuthorName" 
        <selectParameters> 
        <asp:ControlParameter ControlID="txtAuthors" Name="authorname" /> 
        </selectParameters> 
</asp:SqlDataSource>
好的,

我删除了不必要的东西,在添加更多功能之前始终保持简单。

使用 aspx 页背后的代码

标记

<div id="awindow" >
    <asp:Panel ID="Panel1" runat="server" CssClass="mainContent">
    <div style="width: 100%; float: left">    
        <asp:TextBox runat="server" ID="txtFindAuthor" AutoPostBack="true"/>
        <asp:Button ID="btnFindAuthor" runat="server" Text="btnFindAuthor" 
            onclick="btnFindAuthor_Click" />        
    </div>            
        <asp:GridView ID="gvAuthors" runat="server">
         <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="AuthorID" 
                            DataNavigateUrlFormatString='~/AuthorsMain/Authors_Detail.aspx?id={0}'
                            DataTextField="AuthorName" 
                            HeaderText="Author Name" />
        </Columns>
        </asp:GridView>
    </asp:Panel>
</div>

代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    {
        BindAuthorGrid();
    }
    protected void btnFindAuthor_Click(object sender, EventArgs e)
    {           
        BindAuthorGrid();
    }
    private void BindAuthorGrid()
    {
        //Bind search results to AuthorGridView control
        gvAuthors.DataSource = SearchAuthor(txtFindAuthor.Text);
        gvAuthors.DataBind();
    }
    private DataTable SearchAuthor(string authorName)
    {
        var searchResultsTable = new DataTable();
        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Libros"].ConnectionString))
        {
            try
            {   
                var cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                if (authorName != string.Empty)
                {
                    cmd.CommandText = "SELECT * FROM Authors WHERE AuthorName = @authorName ORDER BY AuthorName ASC";
                    cmd.Parameters.AddWithValue("authorName", authorName);
                }
                else
                {
                    cmd = new SqlCommand("SELECT * FROM Authors", conn);
                }
                //create sql adapter by passing command object
                var adapter = new SqlDataAdapter(cmd);
                //fill the search results table
                adapter.Fill(searchResultsTable);
            }
            catch (Exception ex)
            {
                Response.Write(ex.ToString());
            }
        }
        return searchResultsTable;
    }

在阅读了基于@meda答案的冗长讨论后,我现在清楚地看到了您问题的根源。

由于 ASP 页的体系结构和生命周期,您面临着所有这些错误和问题。大多数时候,这真的是脖子上的疼痛。即使在使用 AJAX 时,也可以使用内置更新面板或扩展。

根据您的代码和讨论,我知道您正在使用内置的数据绑定控件来检索数据并标记结果。
第一个代码块必须写入 ImageButton 的单击事件中。右?

只需像这样设置图像按钮属性PostBackUrl...

PostBackUrl='~/Authors_Detail.aspx?id=<%# Eval("AuthorId") %>'


一件事是,它有一点可能不起作用。因为在第一次加载页面时不会有AuthorID值。由于文本框和图像按钮位于同一绑定范围内,因此可能需要再次手动重新呈现整个图像按钮,以更新属性。

我想给你一个好的建议。在这种情况下,实际的最佳方法是在单独的数据绑定面板中显示结果、作者姓名或图像。例如中继器、窗体视图或详细信息视图。
坦率地说,您甚至不需要文本框的绑定面板。你已经得到了ajax的结果。如果您确定结果只显示一条记录,则可以使用窗体视图。或者,如果结果是多个,请使用中继器或列表视图。

在将显示结果的视图中,可以呈现要与上面显示的代码一起使用的控件的属性。您可以使用任何内容,超链接,链接按钮,图像按钮等。
由于视图的结果是在服务器端处理的,因此您可以确保以这种方式将所需的参数值附加到链接。

我知道我的解释有点混乱。如果您无法理解,请注释掉。

最新更新