ASP.NET - vlastní příspěvky a komentáře – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ASP.NET - vlastní příspěvky a komentáře – .NET – Fórum – Programujte.comASP.NET - vlastní příspěvky a komentáře – .NET – Fórum – Programujte.com

 

jstorm0
Duch
13. 2. 2013   #1
-
0
-

Dobrý den, ve svém projektu potřebuji na stránku jednoduché příspěvky a komentáře k nim jako např. na Facebooku.

Příspěvky jsem udělal jednoduše přes tabulku v databázi, SqlDataSource a DataList. Horší to je s komentáři.

Do ItemTemplate DataListu jsem hodil další DataList, určený pro komentáře ke každému příspěvku. Kdyby byl na stránce pouze jeden přispěvek, dokázal bych udělat komentář. V tabulce s komentáři bych měl vazbu na ID příspěvku. Ale nedokážu to vymyslet, když je jich na stránce více, tak aby byl komentář přímo pod příspěvkem, ke kterému patří.

Můžete mi prosím poradit, jak vyřešit tento problém? Případně existuje již nějaké hotové řešení, které bych mohl použít a graficky si ho přizpůsobit?

Nahlásit jako SPAM
IP: 88.103.170.–
jstorm0
Duch
14. 2. 2013   #2
-
0
-

#1 jstorm

Tak už jsem na něco přišel. 


Udělal jsem si tabulku Comments se sloupcem ID příspěvku. Spojil jsem tabulku Posts a Comments příkazem JOIN a komentář se opravdu zobrazí jenom pod příspěvkem, pod kterým má.

Akorát mám 2 problémy. Na stránce se zobrazí pouze ty příspěvky, které mají nějaký komentář. Ty bez komentáře se nezobrazí.

Potom nevím, jak vložit do tabulky s komentáři ID příspěvku, ke kterému komentář napíšu.

Přidám kód:

<div id="GroupPosts">
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:MotWebConnectionString %>" 
        SelectCommand="SELECT * FROM [Posts] 
                        JOIN [Users] ON [Users].[UserName] = [Posts].[UserName] 
                        JOIN [Comments] ON [Comments].[PostId] = [Posts].[PostId]
                        WHERE ([GroupId] = @GroupId) ">
            <SelectParameters>
                <asp:QueryStringParameter Name="GroupId" QueryStringField="id" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>


<asp:Repeater ID="DataList2" runat="server" DataSourceID="SqlDataSource3" >
            <ItemTemplate>
                <table style="width: 100%;">
                    <tr>
                        <td width="10%">    
                            <asp:Image ID="Image2" runat="server" Width="64px" Height="64px" ImageUrl='<%# Eval("ProfilePicture")%>' />
                        </td>
                        <td align="left" width="90%" >
                            <p><asp:Literal ID="Literal2" runat="server" Text='<%# Eval("Username")%>'></asp:Literal></p>
                        </td>
                    </tr>                    
                </table>
                <asp:Literal ID="Literal3" runat="server" Text='<%# Eval("Text")%>'></asp:Literal>

                <table>
                    <tr>
                        <td>
                            <asp:Literal ID="Literal4" runat="server" Text='<%# Eval("CommentText")%>'></asp:Literal>
                        </td>
                    </tr>
                </table>
</ItemTemplate>
</asp:Repeater
 
Nahlásit jako SPAM
IP: 88.103.170.–
m4r100
Návštěvník
15. 2. 2013   #3
-
+1
-
Zajímavé

Zkus LEFT OUTER JOIN

Nahlásit jako SPAM
IP: 94.113.27.–
jstorm0
Duch
15. 2. 2013   #4
-
0
-

Díky za odpověď. Tohle pomohlo, už se zobrazují i příspěvky bez komentáře.

Ještě problém, na který jsem teď přišel. Když má příspěvek více komentářů, tak se ten příspěvek rozdvojí (zkopíruje), je na stránce vícekrát a pod každou kopií je jeden komentář. Nevíte, jak fixnout tohle?

A potom bych ještě potřeboval poradit s tím vkládáním komentářů.

Nahlásit jako SPAM
IP: 88.103.170.–
Evzen+2
Návštěvník
15. 2. 2013   #5
-
+1
-
Zajímavé

Ahoj,

je hezké, že ti něco pod rukama roste, pravděpodobně více či méně naklikané v designeru, ale bez nějakých základů se neobejdeš.

Podívej se aspoň na SQL, co je to select, co je to join, jaký je rozdíl mezi inner a outer joinem atd. Bez toho díru do světa neuděláš.

Nicméně.. 

Být tebou, tak si vytvořím dvě stránky, jedna bude přehledem všech článků (select * from Posts), třeba jen jejich nadpisy, případně nějak profiltrované.

Dál si vytvoř další stránku, kde budeš mít zobrazen pouze jeden článek (jakože jeho detail, select * from Posts where ID=[konkretni_id_clanku]). Pod tímto detailem použiješ třetí DataSource, kde vylistuješ všechny komentáře, které patří k tomuto článku (select * from comments where ID_Post=[konkretni_id_clanku]).

Pak to propojíš tak, že na klik v přehledu tě to přesměruje na detail. Aspoň budeš mít nějaký základ, na kterým můžeš stavět. Pak můžeš přemýšlet o přidávání, filtraci, editaci, atd., atd..

Samozřejmě, jde to udělat mnoha způsoby, chce to nejprve popřemýšlet o návrhu, nastudovat informace, a pak se pustit do práce.

Jestli jedeš na MS SQL, tak ti doporučuji MS SQL Management studio a vyzkoušet si jednotlivé dotazy, abys pochopil, co ti z toho leze.. 

Evžen

Nahlásit jako SPAM
IP: 109.80.214.–
jstorm0
Duch
15. 2. 2013   #6
-
0
-

#5 Evzen
Díky za odpověď. Vaše řešení je dobré a mám ho připravené jako záložní řešení, protože jsem tenhle způsob už v minulosti použil v jiném projektu. 

Teď právě potřebuju, aby na jedné stránce byl seznam všech příspěvků a pod příspěvkem seznam komentářů k němu patřícím. Bohužel se mi to tímto způsobem nedaří.

Co je to SELECT a JOIN vím. Akorát jsem doposud nepotřeboval jiný příkaz, než pouze JOIN. Jaký je rozdíl mezi INNER JOIN a OUTER JOIN se podívám.

Nahlásit jako SPAM
IP: 88.103.170.–
JardaJirava0
Stálý člen
19. 2. 2013   #7
-
0
-

Ahoj,

  jeden příspěvek může mít 0 až N komentářů, z toho je třeba vycházet i při zobrazování. Ve tvém případě máš připravený dobrý základ pro zobrazování použe příspěvků. Teď je otázka, zda se spíše vyhnout dodatečným dotazům na komentáře a nebo se vyhnout zbytečnému načítání příspěvků. Obojí však znamená, že opustíš komfort deklarativního přístupu a budeš muset napsat kód v CodeBehind (spíše vlastní třídě).

  První řešení s dodatečným načtením komentářů může vypadat třeba tak, že si načteš všechny příspěvky samostatně a pak si k nim v jednom dotazu dotáhneš všechny komentáře a správně přes Id přiřadíš. Na úrovni UI pak budeš mít do sebe zanořený List (Repeater, GridView), který se postará o vykreslení příspěvku a k němu komentářů.

  Druhé řešení pak vytáhne pomocí jednoho dotazu jak příspěvky tak komentáře (nejspíše přes LEFT JOIN), na úrovni logiky pak provedeš vytřídění duplicitních příspěvků a přiřazení komentářů. Nevýhodou řešení bude, že v případě velkého množství komentářů budeš zbytečně tahat velký obsah příspěvku v počtu komentářů.

  Pěkný den,

Nahlásit jako SPAM
IP: 38.119.164.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 25 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý