Zawijanie treści w newsach - ASP.NET

0

Mamy klasę SimpleItem która zawiera tytuł i tresc wiadomosci:

class SimpleItem
{
    public string Title
    {
        set
        {
            title = value;
        }
        get
        {
            return title;
        }
    }
    public string Tresc
    {
        set
        {
            tresc = value;
        }
        get
        {
            return tresc;
        }
    }
    string title;
    string tresc;
    /// <summary>
    /// Default constructor
    /// </summary>
    public SimpleItem()
    {
        this.title = "";
        this.tresc = "";
    }
    public SimpleItem(string tytul, string tresc)
    {
        this.title = tytul;
        this.tresc = tresc;
    }

} 

Podczas wczytywania strony robimy jakieś 3 newsy, dla przykładu które są wiązane z kontrolką Repeater o ID "NewsSystem".

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Collection<SimpleItem> myCol = new Collection<SimpleItem>();
            myCol.Add(new SimpleItem("Tytul wiadomosci 1", "Tresc wiadomosci 1, Tresc wiadomosci 1, Tresc wiadomosci 1 "));
            myCol.Add(new SimpleItem("Tytul wiadomosci 2", "Tresc wiadomosci 2, Tresc wiadomosci 2, Tresc wiadomosci2 "));
            myCol.Add(new SimpleItem("Tytul wiadomosci 3", "Tresc wiadomosci 3, Tresc wiadomosci3, Tresc wiadomosci 3"));
            NewsSystem.DataSource = myCol;
            NewsSystem.DataBind();
        }

    }

Repeater:

<asp:Repeater runat="server" ID="NewsSystem">
    <HeaderTemplate>
    <table>
    <tr>
    <td style="width:250px">Najnowsze wiadomosci
    </td>
    </tr>
    </table>
    </HeaderTemplate>
    <ItemTemplate>
    <table>
    <tr>
    <td style="width:250px"><asp:Label ID="txtTitle" runat="server" width="250px" Text='<%# Eval("Title") %>'></asp:Label>
    </td>
    </tr>
    <tr>
    <td style="width:250px"><asp:Label ID="txtTresc" runat="server" Width="250px" Text='<%# Eval("Tresc") %>'></asp:Label>
    </td>
    </tr>
    </table>
    </ItemTemplate>
    </asp:Repeater>

Pytanie za 100 pktów, czy ktoś wie może jakich kontrolek użyć lub jak zrobić to że np. po 200 znakach wiadomość jest zawinięta i mamy pokazane tylko te 200 znaków, po kliknięciu np. "Więcej" przenosi nas do strony wiadomosci z całą jej treścią. No i teraz pytanie drugie, czy dla każdej wiadomosci musiałbym robic nowy *.aspx ? Czy jest to jakoś zoptymalizowane i C#(ASP.NET) sam sobie będzie to robił? Dajmy na to znając treść całej wiadomosci itp.?

0

Nie, nie musisz dla każdej strony robić nowego pliku .aspx, w URL przekazujesz dodatkowy parametr zazwyczaj unikatowy ID, i to przez niego się odwołujesz.

Rozszerz swoją klasę SimpleItem o właściwość id, każdy SampleItem ma inny id. Później np za pomocą SampleItem item = myCol.Single(x=>x.id == 5); wybierasz odpowiedni Item i przekazujesz go do widoku (który obsługuje ten SampleItem).

Co do ucinania tekstu zrób sobie prostego helpera (klasę statyczną), który ucina Ci tekst i używaj go w widoku coś w stylu

static class Heper
{
public string Tnij(SampleItem item)
{
if(item.Tresc.Length > 200)
{
string result = txt.Substring(0,200);
result += "... <a href=""Zobacz_caly_watek?id="+item.ID+"">Czytaj cały temat :"+item.Title+"</a>";
return result;
}
}
}
0

Zmieniłem troche konstruktor żeby nie robić nowej klasy

 
public SimpleItem(string tytul, string tresc, int ID)
    {
        this.title = tytul;
        this.ID = ID;
        if (tresc.Length > 10)
        {
            this.Tresc = tresc.Substring(0, 10) + "... <a href=Default.aspx?news_id=" + this.ID + ">Czytaj cały temat :" + this.Title + "</a>";
            this.TrescCala = tresc;
        }
    }

dodałem w PageLoad:

                
 if (Request.QueryString["news_id"] != null)
        {
            Collection<SimpleItem> jnews = new Collection<SimpleItem>();
            jnews.Add(myCol[Convert.ToInt32(Request.QueryString["news_id"])]);
            JedenNews.DataSource = jnews;
            JedenNews.DataBind();
        }

I dobrze odbiera ten parametr, wszystko jest ok, tylko nie wiem jak tego pierwszego Repeatera nie wyświetlać, nie znalazłem żadnej metody Clear(), Enable czy coś. Poradzi ktoś coś?

0

Jednak się udało, być może jest prostszy sposób, niech ktoś podpowie jeśli wie.

protected void Dodaj()
    {
        myCol.Add(new SimpleItem("Tytul wiadomosci 1", "Tresc wiadomosci 1, Tresc wiadomosci 1, Tresc wiadomosci 1 ", 1));
        myCol.Add(new SimpleItem("Tytul wiadomosci 2", "Tresc wiadomosci 2, Tresc wiadomosci 2, Tresc wiadomosci2 ", 2));
        myCol.Add(new SimpleItem("Tytul wiadomosci 3", "Tresc wiadomosci 3, Tresc wiadomosci3, Tresc wiadomosci 3", 3));
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (myCol.Count == 0) Dodaj();

        if (!IsPostBack)
        {
            NewsSystem.DataSource = myCol;
            NewsSystem.DataBind();
        }
        if (Request.QueryString["news_id"] != null)
        {

            Collection<SimpleItem> jnews = new Collection<SimpleItem>();
            NewsSystem.DataSource = jnews;
            NewsSystem.DataBind();
            jnews.Add(myCol[Convert.ToInt32(Request.QueryString["news_id"])-1]);
            JedenNews.DataSource = jnews;
            JedenNews.DataBind();
        }

    } 

Metoda dodaj jest w tym momencie "sztuczna", tylko do testow, w przyszlosci bedzie to wczytywane z bazy danych. Zrobiłem to w ten sposob ze jak dodaje jednego newsa, robie kolekcje i zanim cos do niej dodam robie wiazanie danych z tym starym repeaterem i w tym momencie robi sie pusty, natomiast wracajac do strony glownej z powrotem on sie wypelnia, wiec jest ok.

Wielkie dzięki tomkos za naprowadzenie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1