SqlSiteMapProvider   zodpovězená otázka

ASP.NET WebForms

Ve Vašem seriálu jsme vytvořili SqlSiteMapProvidera, kdy se tímto do roletkového menu vytvoří jednotlivé kategorie, které si vytáhne z databáze. Když si kliknu v tomto menu na jednotlivou kategorii tak to směřuje na stránku default.aspx. A teď k problému. Já jsem chtěl, aby když si kliknu na jednotlivou kategorii, tak aby jsem dostal seznam věcí v dané kategorii. Z tohoto důvodu jsem na stránku default.aspx zadal SqlDataSource, který jsem nasměroval na danou databázi, ze které si má vytáhnout data ( to znamená na tabulku categories ). Poté jsem nastavil QueryStringParameter, aby si id vytáhl z url adresy. Bohužel to ale žádná data nezobrazí (ukáže se mi prázdná stránka default.aspx). Jenom doplním, že k zobrazení dat používám GridView. Netušíte kde dělám chybu ? Nebo jestli to tak vůbec lze provést.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Přiložte alespon ukázku kódu,nejlépe ale celou stránku default.aspx.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady je kód ze stránky default.aspx :

<%@ Page Language="VB" MasterPageFile="~/MasterPage.master" Title="Categories" %>

 <script runat="server">

 </script>


 <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
         ConnectionString="<%$ ConnectionStrings:VypujckyConnectionString %>" 
         SelectCommand="SELECT * FROM [Categories] WHERE ([CategoryId] = @CategoryId) ORDER BY [Title]">
         <SelectParameters>
             <asp:QueryStringParameter Name="CategoryId" QueryStringField="id" 
                 Type="Int32" />
         </SelectParameters>
     </asp:SqlDataSource>
     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
         DataKeyNames="CategoryId" DataSourceID="SqlDataSource1">
         <Columns>
             <asp:BoundField DataField="CategoryId" HeaderText="CategoryId" />
             <asp:BoundField DataField="Title" HeaderText="Název" />
         </Columns>
     </asp:GridView>
     
     
 </asp:Content> 

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V URL nepředáváte žádnou hodnotu ID,tím pádem se ani nenaplní GridView.

Druhá věc je,proč se téma jmenuje SqlSiteMapProvider,když řešíte problém s GridView.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To máte asi pravdu.. domníval jsem se, že když v roletkovém menu cvaknu na danou kategorii tak se mi tímto do url vloží i potřebné ID dané kategorie (což i udělá). A pokud SqlSiteMapProvider směřuje na stránku default.aspx tak jsem si myslel, že by se na této stránce dalo potřebné ID odchytit přes QueryStringParameter a následně zobrazit přes GridView. Pokud je nadpis zavádějící tak se zato samozřejmě omlouvám. Dobře takže to takhle nelze provést a to mi stačí. Za projevenou ochotu děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud budete na stránce Default.aspx?id=xx a v databázi bude kategorie s ID xx, mělo by vám to zobrazit jeden řádek s tou danou kategorií. Nevidím tam žádnou chybu, fungovat by to mělo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jo jo v url se přesně zobrazí default.aspx?id=xx i s daným ID, ale bohužel stránka je prázdná a GridView nic nezobrazí. Tak právě nevím kde je chyba. Se jen snažím trošku pokračovat ve Vašem seriálu :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ať koukám, jak koukám, chybu prostě nevidím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

:)) jo jo. Seriál mám hotový přesně jak jste ho ukončil a tohle jsem zkusil a právě nic. Tak si s tím nebudeme lámat hlavu. Klidně to můžete zkusit u sebe jestli Vám to bude fungovat, ale jenom jestli budete mít čas. Jinak moc děkuji za Vaší práci, kterou si s náma začátečníkama děláte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

pokud máte v URL id tak nevidim žádný problém a důvod proč by to nemělo fungovat.Můžete ještě pro jistotu ukázat příklad databázovího záznamu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím přesně co myslíte tím databázovým záznamem (jsem fakt začátečník), ale celou aplikaci jsem vytvořil přesně podle seriálu o ASP.NET a bez problému mi vše funguje. Tedy až na tento. Takže pokud si stáhnete zdrojové kódy aplikace, kterou Tomáš Herceg zpřístupnil zde na webu v seriálech o ASP.NET tak se to dá vyzkoušet. Já jsem to zkusil a bohužel to stále nefunguje. Tak nevím kde je zakopaný pes. Kdyby to aspoň hodilo nějakou chybu, ale ono nic. Jinak jsem to zkusil ještě takhle :

<%@ Page Language="VB" MasterPageFile="~/MasterPage.master" Title="Přehled výpůjček" %>
<%@ Import Namespace="System.Data.SqlClient" %>



<script runat="server">
 
   
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        FetchCategoriesName()
    End Sub
    
    ''' <summary>
    ''' Vytáhnout z databáze Categorii
    ''' </summary>
    Private Sub FetchCategoriesName()
        'stačí obnovit jen při prvním načtení stránky
        If Not IsPostBack Then
            'sestavit connectionString a SQL dotaz
            Dim connStr As String = _
            ConfigurationManager.ConnectionStrings("VypujckyConnectionString").ConnectionString
            Dim sqlCommand As String = _
            "SELECT [Title] FROM [Categories] WHERE [CategoryId] = @CategoryId"
            
            'vytvořit připojení k databázi
            Using con As New SqlConnection(connStr)
                'vytvořit příkaz
                Using com As New SqlCommand(sqlCommand, con)
                    'přidat parametry
                    com.Parameters.AddWithValue("CategoryId", Request.QueryString("id"))
                    'otevřít spojení
                    con.Open()
                    'vytáhnout výsledek
                    TitleLabel.Text = com.ExecuteScalar().ToString()
                    'zavřít spojení
                    con.Close()
                End Using
            End Using
            
        End If
    
    
    End Sub
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

    <h2>
        <asp:Label ID="TitleLabel" runat="server" Text="Všechny Kategorie"></asp:Label> 
    </h2>

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:VypujckyConnectionString %>" 
        SelectCommand="SELECT * FROM [Categories] WHERE ([CategoryId] = @CategoryId)">
        <SelectParameters>
            <asp:QueryStringParameter Name="CategoryId" QueryStringField="id"  Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="CategoryId" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="CategoryId" HeaderText="CategoryId" />
            <asp:BoundField DataField="Title" HeaderText="Title" />
        </Columns>
        <EmptyDataTemplate>
        <em>V evidenci nejsou žádné záznamy</em>
        </EmptyDataTemplate>
    </asp:GridView>
</asp:Content>

ale to už tedy chybu hodilo. Takže takhle to asi taky nejde. Jestli budete chtít můžu sem dát i chybu, kterou to vyhodilo, ale hlavně mě hned nekamenujte, že jsem .... , protože to určitě jsem když to nechodí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě dodám chybu, kterou to vyhodí a sice tato :

The parameterized query '(@CategoryId nvarchar(4000))SELECT [Title] FROM [Categories] WHE' expects the parameter '@CategoryId', which was not supplied.

Tak když by někdo byl tak ochotný a poradil tak bych mu byl moc vděčný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdyby jste to měl přesně podle seriálu,tak to fungovat bude.Něco máte špatně,tak bádejte a určitě na to přijdete :))

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už jsem přišel nato kde je chyba...(hurá). Takže pro ty kdo by měli zájem. Chyba byla v tom, že jsem měl v

QueryStringField="id" 

a mělo tam být

QueryStringField="category"

proto to nechtělo nic zobrazit. Takže první způsob funguje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musela to být nějaká "volovina",protože kód byl v pořádku.Proto jsem Vás v jednom příspěvku prosil o show table definition či ukázku row záznamu.

Gratuluji k vyřešení ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback