2016-08-05 72 views
0

我有一個註釋類,創建時存儲用戶的id,並且從我理解的實體框架將此Id映射到用戶。這在最初加載視圖時起作用。但是,當我添加一個新評論,並由於某種原因返回PartialView作者(應用程序用戶)爲空,並引發異常。但是,如果我重新加載頁面,則會顯示新的註釋並顯示正確的ApplicationUser信息。返回PartialView時ApplicationUser爲空

public class Comment 
{ 
    public Guid ID { get; set; } 
    public string Text { get; set; } 


    [Required] 
    public string AuthorId { get; set; } 

    [ForeignKey("AuthorId")] 
    public virtual ApplicationUser Author { get; set; } 

    public DateTime DateSubmitted { get; set; } 
    public Guid PostID { get; set; } 
    public virtual Post Post { get; set; } 

} 

我使用ViewModel來處理視圖上的數據。

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

這是我的控制器Action。

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); 

    } 

此foreach顯示CommentList中的所有評論。提交新評論時,它會在應該顯示@ item.Author.Id的行上崩潰。

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> 

    } 

回答

1

評論。作者是虛擬的,所以您需要在保存後明確加載它。變化:

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

要:

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

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

+0

或者作爲測試,保持'SqlConnection'開放而渲染(一劈!) – leppie