IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: ASP.NET MVC Null Exception Reference

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:11.12.2017 17:48

Ahoj, z předešlého vlákna vytvářim pro tento problém samostatný vlákno:
Takže napřed úvodní věci.
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();
       }

(všimněte si zakomentovaných datetime)
ViewModel:

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

A předpokládám, že z důvodu ViewModelu 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.
Obdobnej kód pro Posts (kterej ale mam vedenej přímo na model Post a ne přes viewmodel ) funguje bezproblému.
Předem díky za rady :)

 
Odpovědět
11.12.2017 17:48
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Fenrix
vajkuba1234:11.12.2017 22:39

Co takhle pres konstruktor ve Viewmodelu nebo Modelu?

public class Comment
    {
        public Comment()
        {
            Comm_Date = DateTime.Now;
        }

        [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; }
    }

Radeji bych to dal primo do viewmodelu, ktery slouzi pro vytvoreni komentare. Nacpes si do nej texty, ktere potrebujes a datum vytvoreni tam mas jiz automaticky a nemusis se o to starat...

Pokud se nekde snazis vypsat obsah DateTime?, tak kontroluj, zda ma hodnotu a pak vypis property Value.

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

jasný, zkusim. dík :)

 
Nahoru Odpovědět
12.12.2017 11:55
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 3 zpráv z 3.