作者 ID 未传递到重定向字符串
本文关键字:重定向 字符串 ID 作者 | 更新日期: 2023-09-27 18:35:48
我有一个文本框,我需要将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的结果。如果您确定结果只显示一条记录,则可以使用窗体视图。或者,如果结果是多个,请使用中继器或列表视图。
在将显示结果的视图中,可以呈现要与上面显示的代码一起使用的控件的属性。您可以使用任何内容,超链接,链接按钮,图像按钮等。
由于视图的结果是在服务器端处理的,因此您可以确保以这种方式将所需的参数值附加到链接。
我知道我的解释有点混乱。如果您无法理解,请注释掉。