#c# #asp.net-core-mvc
Вопрос:
У меня есть 2 модели, которые публикуют и комментируют
public class Post
{
[Key]
public Guid Id { get; set; }
public string Slug { get; set; }
public class Comment
{
public Guid Id { get; set; }
public Guid PostId { get; set; }
public virtual Post Post { get; set; }
....
}
Комментарии создаются на странице сведений о посте , где я принимаю postID как скрытый.
Доступ к сообщениям осуществляется через slug, который создается в процессе создания сообщений.
После отправки сообщения пользователь должен вернуться на страницу публикации. Комментарий создается с помощью метода действия create() в контроллере комментариев. Если это через идентификатор , я могу сделать
return RedirectToAction("Details","Posts" , new { id = postId });
Но поскольку slug используется вместо идентификатора, что мне делать при использовании slug для доступа к деталям записи вместо идентификатора. Я действительно пытался взять слизняка, как скрытого в поле зрения
Это комментарии, созданные в контроллере комментариев
public async Task<IActionResult> Create([Bind("PostId,Body")] Comment comment)
{
if (ModelState.IsValid)
{
comment.Created = DateTime.Now;
comment.Id = Guid.NewGuid();
_context.Add(comment);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Вот такой вид
Вот Пост.Идентификатор скрыт
<!--Display Comments related to posts-->
<div>
@if (User.Identity.IsAuthenticated)
{
<form asp-action="create" asp-controller="comments" method="post">
@Html.Hidden("PostId", Model.Post.Id)
<div class="form-group">
<label class="h4 ">Add Comments</label>
<textarea name="body" class="form-control" rows="10"></textarea>
</div>
@
<button type="submit" class="btn btn-outline-dark btnReadMore btn-block btn-sm">Submit</button>
</form>
}
else
{
<a class="btn btn-block btn-sm btn-outline-dark btnReadMore" asp-area="identity" asp-page="/Account/Login">
Login To add comments
</a>
}
</div>
Комментарии:
1. Прочитайте сообщение для записи из базы данных (), используя идентификатор.
_context
2. Не могли бы вы указать мне на статью или какую-нибудь документацию ?
3. Вы должны опубликовать весь код, включая представления и действия, чтобы получить некоторую помощь. Трудно понять, что вы представляете.
4. Можете ли вы включить код для конечной точки, которая получает ответ
Post
на ваш вопрос?
Ответ №1:
смог решить эту проблему , включив это в свой контроллер
var nComment = await _context.Comments.Include(p => p.Post).FirstOrDefaultAsync();
Теперь метод действия контроллера выглядит следующим образом
public async Task<IActionResult> Create([Bind("PostId,Body, Post")] Comment comment)
{
if (ModelState.IsValid)
{
var nComment = _context.Comments.Include(p => p.Post).FirstOrDefault(p => p.PostId == comment.PostId);
comment.Created = DateTime.Now;
comment.Id = Guid.NewGuid();
//author of the comment
comment.BlogUserId = _userManager.GetUserId(User);
_context.Add(comment);
await _context.SaveChangesAsync();
return RedirectToAction("Details","Posts" , new { slug = nComment.Post.Slug });
}```
Комментарии:
1. Ты становишься немного ближе. Вы упускаете две вещи. Сначала вам нужно что-то сделать, чтобы связать новый комментарий с соответствующей публикацией (например, назначить
PostId
свойство комментарию). Во-вторых, вам нужно прочитать сообщение из базы данных, чтобы получить сообщение. Строка, которую вы добавили, читает первый комментарий сообщение, независимо от того, правильное ли это сообщение. Для этого вам нужно добавить что-то вроде.Where(p => p.Post.Id == postId)
.2. @JackA Спасибо, что нашли время проверить и объяснить это.
Post.id
является скрытым атрибутом в представлении , который связывает комментарий с сообщением. Я добавилvar nComment = _context.Comments.Include(p => p.Post).FirstOrDefaultAsync(p => p.PostId == comment.PostId).Resu<
, что должен был добавить». Результат` в конце, иначе это приводило к ошибке. Задача<Комментарий>» не содержит определения для «Публикации» … если я это сделаю. FirstOrDefaultAsync() и отлично работает без async() Не могли бы вы объяснить, что.Result
делает? Спасибо, я добавил часть просмотра в вопрос3.
Result
Свойство позволяет получить синхронный доступ к результату задачи, но это не самый предпочтительный метод. Лучше написать строку какvar nComment = await _context.Comments.Include(p => p.Post).FirstOrDefaultAsync(p => p.PostId == comment.PostId);
. Общее эмпирическое правило состоит в том, что любой метод, заканчивающийсяAsync
возвращением задачи, должен использоватьсяawait
для получения фактического результата задачи. Видишь docs.microsoft.com/en-us/dotnet/csharp/async4. Большое вам спасибо!!