2016-08-05 19 views
0

Ich habe eine Kommentarklasse, die beim Erstellen die ID des Benutzers speichert, und nach meinem Verständnis bildet das Entitätsframework diese ID dem Benutzer zu. Dies funktioniert beim ersten Laden der Ansicht. Aber wenn ich einen neuen Kommentar hinzufüge und die PartialView aus irgendeinem Grund zurückgebe, ist der Autor (Anwendungsbenutzer) null und eine Ausnahme wird ausgelöst. Wenn ich die Seite neu lade, wird der neue Kommentar jedoch mit den korrekten ApplicationUser-Informationen angezeigt.ApplicationUser ist null beim Zurückgeben von PartialView

Ich verwende ein ViewModel, um die Daten in der Ansicht zu behandeln.

public class CommentViewModel 
{ 
    public string Text { get; set; } 
    public Guid PostID { get; set; } 
    public List<Comment> CommentList { get; set; } 
} 

Hier ist meine Controller-Aktion.

public ActionResult CreateComment(CommentViewModel viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
      var currentUser = manager.FindById(User.Identity.GetUserId()); 

      var comment = new Comment 
      { 
       ID = Guid.NewGuid(), 
       AuthorId = currentUser.Id, 
       DateSubmitted = DateTime.Now, 
       PostID = viewModel.PostID, 
       Text = viewModel.Text 

      }; 

      Debug.Write("PostID:" + comment.PostID + "Author: " + "Text: " + comment.Text); 
      db.Comments.Add(comment); 
      db.SaveChanges(); 
      CommentViewModel model = new CommentViewModel(); 
      model.CommentList = db.Comments.Where(i => i.PostID == comment.PostID).OrderByDescending(c => c.DateSubmitted).ToList(); 
      return PartialView(model); 

     } 
     else 
     { 
      Debug.Write("not valid"); 

     } 

     return PartialView(viewModel); 

    } 

Dieser Foreach zeigt alle Kommentare aus der Kommentarliste an. Wenn ein neuer Kommentar gesendet wird, stürzt er in der Zeile ab, die @ item.Author.Id anzeigen soll.

foreach (var item in Model.CommentList) 
    { 


     <div class="row"> 
      <div class="col-sm-1"> 
       <div class="thumbnail"> 
        <img class="img-responsive user-photo" src="https://ssl.gstatic.com/accounts/ui/avatar_2x.png"> 
       </div><!-- /thumbnail --> 
      </div><!-- /col-sm-1 --> 

      <div class="col-sm-5"> 
       <div class="panel panel-default"> 
        <div class="panel-heading"> 
         <strong>@item.Author.Id</strong> 

         <time class="timeago" datetime="@item.DateSubmitted"></time> 

        </div> 
        <div class="panel-body"> 
         @item.Text 
        </div><!-- /panel-body --> 
       </div><!-- /panel panel-default --> 
      </div><!-- /col-sm-5 --> 
     </div> 

    } 

Antwort

1

Kommentar.Author ist virtuell, so dass Sie es nach dem Speichern explizit laden müssen. Wechsel:

model.CommentList = db.Comments.Where(i => i.PostID == comment.PostID).OrderByDescending(c => c.DateSubmitted).ToList(); 

An:

model.CommentList = db.Comments 
    .Include(c => c.Author) 
    .Where(i => i.PostID == comment.PostID) 
    .OrderByDescending(c => c.DateSubmitted).ToList(); 

Siehe https://msdn.microsoft.com/en-us/library/gg671236%28v=vs.103%29.aspx#Anchor_1

+0

Oder als Test, halten Sie die 'SqlConnection' offen, während Rendering (ALS HACK!) – leppie