У меня есть класс комментариев, который при создании хранит идентификатор пользователя, и из моего понимания структура сущности сопоставляет этот идентификатор пользователю. Это работает при первоначальной загрузке представления. Но когда я добавляю новый комментарий и возвращаю 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>
}
Или как испытание, держать 'SqlConnection' открытыми во время рендеринга (AS хак!) – leppie