1

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

作者编号:

<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>
4

2 回答 2

0

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

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

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

只需像这样设置 ImageButton 属性PostBackUrl...

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


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

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

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

我知道我的解释有点混乱。看不懂的请评论。

于 2013-10-21T09:40:46.100 回答
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;
    }
于 2013-10-23T15:41:18.877 回答