Я пытаюсь выполнить действие Edit с помощью DI.
Я использую Управлять View для редактирования или удаления объектов.
Я отправляю интерфейс:
using collector_forum.Data.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace collector_forum.Data
{
public interface IPost
{
Post GetById(int id);
IEnumerable<Post> GetAll();
IEnumerable<Post> GetFilteredPosts(int id, string searchQuery);
IEnumerable<Post> GetFilteredPosts(string searchQuery);
IEnumerable<Post> GetPostsByCategory(int id);
IEnumerable<Post> GetLatestPosts(int n);
Task Add(Post post);
Task Delete(int id);
void Update(Post post);
Task AddReply(PostReply reply);
}
}
PostService Метод обновления:
public void Update(Post post)
{
_context.Posts.Update(post);
_context.SaveChanges();
}
PostController Edit GET и POST Action:
public IActionResult Edit(int postId)
{
Post postt = _postService.GetById(postId);
return View(postt);
}
[HttpPost]
public IActionResult Edit(Post post)
{
_postService.Update(post);
return RedirectToAction("Manage");
}
Почта Модель, к которой относятся методы Обновлять и Редактировать:
using System;
using System.Collections.Generic;
namespace collector_forum.Data.Models
{
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime Created { get; set; }
public virtual ApplicationUser User { get; set; }
public virtual Category Category { get; set; }
public virtual IEnumerable<PostReply> Replies { get; set; }
}
}
Это мой вид Редактировать:
@model collector_forum.Data.Models.Post
@{
ViewData["Title"] = "Edit Post";
}
<div class = "container body-content">
<div class = "row sectionHeader">
<div class = "sectionHeading">New Post</div>
<div class = "sectionDescription">
<p>
Please read the Forum Guidelines before creating a new post.
@if (!Context.User.Identity.IsAuthenticated)
{
<span>You must be a <a asp-controller = "Account" asp-action = "Register">registered member</a> to create a new post.</span>}
</p>
</div>
@if (Context.User.Identity.IsAuthenticated)
{
<div class = "createPost">
<div class = "row createPost">
<div class = "createPostSection">
<div class = "authorBlock">
You're submitting this post as <strong>@Model.User.UserName</strong>
</div>
<form asp-action = "Edit" method = "post" id = "addPostForm">
<div class = "form-group">
<label asp-for = "Title"></label>
<input asp-for = "Title" class = "form-control" />
</div>
<div class = "form-group">
<label asp-for = "Content"></label>
<input asp-for = "Content" class = "form-control" />
</div>
<button type = "submit" id = "submitPostBtn" class = "btn btn-submitPost">
Edit Post
</button>
<input asp-for = "Category.Id" type = "hidden" />
</form>
</div>
</div>
</div>
}
</div>
</div>
Я следую этому руководство и не могу заменить postId - он создает новый идентификатор и не может передавать неотредактированные значения, такие как userId / UserName.
Когда я подтверждаю отредактированный пост, я получаю исключение NullReferenceException из базы данных - страница ошибок
А это мой вид таблицы после "изменений" - DBtable
Как просто отредактировать заголовок и содержимое этого сообщения, не касаясь других полей?
Если Вам понадобится больше кода, дайте мне знать.
Я просто редактирую вопрос и добавляю нужный вам код. Я включил код для метода Update
@Piotr Пожалуйста, проверьте stackoverflow.com/questions/4660142/…, чтобы узнать, как исправить исключения NullReferenceExceptions.
@Piotr Добро пожаловать в Stack Overflow. Пожалуйста, возьмите тур, чтобы узнать, как работает Stack Overflow, и прочитайте Как спросить о том, как улучшить качество вашего вопроса. Затем редактировать ваш вопрос, чтобы включить полный исходный код, который у вас есть как минимальный воспроизводимый пример, который может быть скомпилирован и протестирован другими. Код, который вы предоставили, является неполным, поскольку исключение исходит от HomeController и его страницы просмотра.
@Progman Почему вы перенаправляете меня на другой вопрос, который не очень связан с моей проблемой? Мой вопрос о передаче или непрохождении определенных значений полей. Которые заявлены в Model. Простой вопрос, мужик. Я новичок в этой технологии, поэтому я здесь, чтобы спросить других
@Piotr Пожалуйста, проверьте stackoverflow.com/questions/13402227/…, чтобы узнать, как передавать переменные / значения из вашей модели, которые нельзя напрямую редактировать в вашей HTML-форме (например, id).





Вы не передаете userId в действие Edit при публикации формы, поэтому, когда вы обновляете Post post, UserId будет нулевым. Вы можете добавить скрытый ввод с помощью в вашу форму Edit View:
<input asp-for = "User.Id" type = "hidden" />
Таким образом, у вас будет идентификатор пользователя в Post post вашего действия Edit, а затем вы можете сохранить его в db.
Мы не знаем, что находится в вашей переменной
post(внутри действияEdit(Post post), и мы не знаем, как выглядит ваш метод_postService.Update(post), поэтому невозможно определить, в чем проблема.