1

authorid選択した作成者に一致する非表示フィールドに渡す必要があるテキスト ボックスがあります。次に、それを response.redirect url に渡す必要がauthorIDあります。これにより、ボタンをクリックしたときに詳細な著者ページが開き、その著者の経歴情報が表示されます。
以下は私のコードですが、動作しません。
作成者の名前が選択されるたびに正しい 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>
4

2 に答える 2

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 に答える
0

@meda からの回答に基づく長い議論を読んだ後、問題の原因がはっきりとわかりました。

ASP ページのアーキテクチャとライフサイクルが原因で、これらすべてのエラーと問題に直面しています。ほとんどの場合、それは本当に首の痛みです。AJAX を使用している場合でも、組み込みの更新パネルまたは拡張機能のいずれかです。

コードとディスカッションに基づいて、組み込みのデータ バインディング コントロールを使用してデータを取得し、結果をマークアップしていることがわかります。
最初のコード ブロックは、ImageButton のクリック イベント内に記述する必要があります。右?

このように ImageButton プロパティを設定するだけPostBackUrlです...

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


1 つのことは、それが機能しない可能性がわずかにあるということです。AuthorIDページが最初に読み込まれたときに値がないためです。テキスト ボックスと画像ボタンは同じバインディング スコープにあるため、プロパティを更新するには、画像ボタン全体を手動で再レンダリングする必要がある場合があります。

いいアドバイスをしたいです。この場合の実際の最適なアプローチは、結果、作成者名または画像を別のデータ バインディング パネルに表示することです。リピーター、フォーム ビュー、詳細ビューなど。
率直に言って、テキスト ボックスのバインド パネルは必要ありません。あなたはすでにajaxで結果を得ています。結果が 1 つのレコードのみであることが確実な場合は、フォーム ビューを使用できます。または、結果が複数の場合はリピーターまたはリスト ビューを使用します。

結果を表示するビュー内で、上に示したコードで使用するコントロールのプロパティをレンダリングできます。ハイパーリンク、リンクボタン、イメージボタンなど、何でも使用できます。
ビューの結果はサーバー側で処理されるため、目的のパラメーター値がこの方法でリンクに関連付けられていることを確認できます。

私の説明が少し厄介であることは承知しています。わからないところはコメントください。

于 2013-10-21T09:40:46.100 に答える