2016-08-05 3 views
0

У меня есть класс комментариев, который при создании хранит идентификатор пользователя, и из моего понимания структура сущности сопоставляет этот идентификатор пользователю. Это работает при первоначальной загрузке представления. Но когда я добавляю новый комментарий и возвращаю PartialView по какой-либо причине, автор (пользователь приложения) имеет значение null и генерируется исключение. Однако, если я перезагружаю страницу, новый комментарий отображается с отображаемой информацией о ApplicationUser.ApplicationUser имеет значение null при возврате PartialView

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

Здесь мой контроллер Действие.

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

    } 

В этом предпросмотре отображаются все комментарии из комментария. При отправке нового комментария он выходит из строя на строке, которая должна отображаться @ 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

Комментарий.Author является виртуальным, поэтому вам необходимо явно загрузить его после сохранения. Изменение:

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

To:

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' открытыми во время рендеринга (AS хак!) – leppie

Смежные вопросы