AuthorID未传递给重定向字符串

时间:2013-10-18 01:53:39

标签: c# asp.net

我有一个文本框,我需要将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>

2 个答案:

答案 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;
    }