我有一个文本框,我需要将authorid
传递到与所选作者匹配的隐藏字段中。
然后,我需要将authorID
传递给response.redirect网址,以便在单击按钮时打开详细作者页面,其中包含该作者的传记信息。
以下是我的代码,但它不起作用
如何让我的按钮工作,以便每次选择作者姓名时都传递正确的authorid?
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") %>' />
作者ID:
<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>
答案 0 :(得分:0)
在根据@meda的答案阅读了长时间的讨论之后,我现在清楚地看到了问题的根源。
由于ASP页面的体系结构和生命周期,您将面临所有这些错误和问题。大多数时候,这真的是一种痛苦。即使使用AJAX,也可以使用内置更新面板或扩展。
根据您的代码和讨论,我知道您正在使用内置数据绑定控件来检索数据,并标记结果。
必须在ImageButton的click事件中写入第一个代码块。正确?
只需像这样设置ImageButton属性PostBackUrl
......
PostBackUrl='~/Authors_Detail.aspx?id=<%# Eval("AuthorId") %>'
有一点是,它可能不起作用的可能性很小。因为在第一次加载页面时您将没有AuthorID
值。由于文本框和图像按钮位于相同的绑定范围内,因此可能需要再次手动重新渲染整个图像按钮以更新属性。
我想给你一个很好的建议。在这种情况下,实际的最佳方法是在单独的数据绑定面板中显示结果,作者姓名或图像。例如转发器,表单视图或详细信息视图。
坦率地说,你甚至不需要文本框的绑定面板。您已经使用ajax获得了结果。如果您确定结果只出现一条记录,则可以使用表单视图。或者,如果结果是多个,则使用转发器或列表视图。
在您将显示结果的视图中,您可以使用我上面显示的代码渲染您将要使用的控件的属性。您可以使用任何东西,超链接,链接按钮,图像按钮等 由于视图的结果是在服务器端处理的,因此您可以确保以这种方式将所需的参数值附加到链接。
我知道我的解释有点乱。如果您无法理解,请注释掉。
答案 1 :(得分:0)
好的,我删除了不必要的东西,在添加更多功能之前始终保持简单。
使用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;
}