NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: ASP.NET MVC přidání komentáře k specifickému článku

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Fenrix
Člen
Avatar
Fenrix:10.12.2017 19:27

Ahoj, tak už zase hledam radu, z výsledkk hledání na stacku jsem moc štěstí neměl :)
Takže, dělám si takovej malej projektík (prakticky kopie facebooku)
Login, registraci mám vyřešen, vkládání statusů také a částečně jsem vyřešil přidávání komentářů ke statusu.
Problém nastává v tu chvíli, že komentář se mi přidá ke všem statusům místo konkrétního statusu.
Code-first třídy:

public class Post
    {
        [Key]
        public int post_ID { get; set; }
        public string post_txt { get; set; }
        public DateTime? post_date { get; set; }
    }
public class Comment
   {
       [Key]
       public int Comm_ID { get; set; }
       public string Comm_Txt { get; set; }
       public int post_ID { get; set; }
    //   public DateTime? Comm_Date { get; set; }
   }

Controller:

public ActionResult Comments(int? id)
       {
           PostCommentVM postCommentVM = new PostCommentVM();
           if (id == null)
           {
               return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
           }
           postCommentVM.post = db.Posts.Find(id);
           if (postCommentVM.post == null)
           {
               return HttpNotFound();
           }
           return View(postCommentVM);
       }

       public PartialViewResult _PartialComments()
       {
           var newComments = db.Comments.OrderByDescending(c => c.Comm_ID);

           return PartialView(newComments);
       }


       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult Comments([Bind(Include = "Comm_ID, Comm_Txt")] Comment comment)
       {
           PostCommentVM postCommentVM = new PostCommentVM();

           if (ModelState.IsValid)
           {
              // postCommentVM.comment.Comm_Date = DateTime.Now;
               db.Comments.Add(comment);
               db.SaveChanges();

           }
           //
           // komentují se všechny statusy, ne jen jeden konkrétní
           //
           return View();
       }

S entity frameworkem zatím ještě moc nekamarádím, takže nemam tušení jak v modelu a controlleru vyřešit vazbu tabulek a jak určit přiřazení komentáře ke statusu.
...
Když už sem píšu tak se zmínim ještě o jenom problému, který mi nejde vyřešit a to je Null reference exception.
Kvůli přidávání komentářů jsem už byl nucen udělat ViewModel:

public class PostCommentVM
{
    public Post post { get; set; }
    public Comment comment { get; set; }
 }

A předpokládám, že právě z toho důvodu mi Datetime v Comments hlásí Null (pro doplnění, v controlleru je nastaven na Datetime.now pro zobrazení datumu odeslání komentáře a ve třídě Comment je "Datetime?" tedy nullovatelný, jinak formulář s novym statusem/komentářem nejde odeslat. Z nějakýho důvodu ale, jak to prochází přes ViewModel a přes něj až do třídy Comment mi hlásí Null exception reference a netušim jak to obejít.
Předem díky za rady :)

 
Odpovědět
10.12.2017 19:27
Avatar
Fenrix
Člen
Avatar
Fenrix:10.12.2017 19:33

ještě jsem zapomněl (a editovat už nemůžu), při přidání novýho komentáře mi zmizí status, který je zobrazen nad ním. Tak nějak tuším, že v controlleru v akci na vytvoření komentáře bych měl do return view(); něco vložit, ale nenapadá mě jak to teď udělat aby mi vrátil view z té první akce (public ActionResult Comments(int? id))

 
Nahoru Odpovědět
10.12.2017 19:33
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Fenrix
vajkuba1234:10.12.2017 19:37

Model Post by mel mit list komentaru, ne? Proste, pokud budes pridavat k clanku komentar, tak k tomu clanku pridej id komentare. Navic vidim, ze vybirad vsechny komentare v metode "public PartialViewResult _PartialComments()" coz asi delat nechces, co?

Editováno 10.12.2017 19:37
Nahoru Odpovědět
10.12.2017 19:37
No hope, no future, JUST WAR!
Avatar
Fenrix
Člen
Avatar
Odpovídá na vajkuba1234
Fenrix:10.12.2017 19:53

var newComments = db.Comments.Or­derByDescendin­g(c => c.Comm_ID);
tohle bylo zamýšlený jako zobrazení všech komentářů ke statusu (abych alespon viděl, že to funguje) a následně jsem chtěl řešit, aby se u danýho statusu zobrazovali jen komentáře k němu související.
takže do modelu Post bych dal něco jako
iCollection<Com­ments> comments {get; set;} ?
jakej kód by potom v controlleru přiřadil ke každýmu komentáři ID statusu, ke kterýmu patří?

btw: můj druhej komentář ohledně mizení statusu po přidání komentáře vyřešil
return RedirectToActi­on("Comments");
už jsem to zkoušel dřív, ale zapomněl jsem na uvozovky a divil se, proč mi to hlásí error.. :D

 
Nahoru Odpovědět
10.12.2017 19:53
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Fenrix
vajkuba1234:10.12.2017 20:00

Takze kdyz vytvaris komentar, dany koment prijme jako parametr ActionResult metoda, ty si nactes konkretni post dle jeho id a do listu komentaru priradis onen komentar.

takže do modelu Post bych dal něco jako
iCollection<Com­ments> comments {get; set;} ?

Ano

Nahoru Odpovědět
10.12.2017 20:00
No hope, no future, JUST WAR!
Avatar
Fenrix
Člen
Avatar
Odpovídá na vajkuba1234
Fenrix:10.12.2017 20:02

a jak by prosím vypadal kód na přiřazení toho komentáře k danýmu postu? :)

 
Nahoru Odpovědět
10.12.2017 20:02
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Fenrix
vajkuba1234:10.12.2017 20:06

neco jako:
var danyPost = db.Posts.Where(p => p.Id == id).FirstOrDe­fault();
danyPost.Komen­tare.Add(pricho­ziKomentar);
proste to priradis do kolekce...

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
10.12.2017 20:06
No hope, no future, JUST WAR!
Avatar
Fenrix
Člen
Avatar
Fenrix:10.12.2017 20:10

super, díky moc :)
a kdybys náhodou věděl co s tim null exception z prvního postu, bylo by to super :D

Editováno 10.12.2017 20:11
 
Nahoru Odpovědět
10.12.2017 20:10
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Fenrix
vajkuba1234:10.12.2017 20:27

Zaloz nove vlakno pro tu vyjimku. Lepe se to pak bude hledat i druhym se stejnym problemem. :)

Nahoru Odpovědět
10.12.2017 20:27
No hope, no future, JUST WAR!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.