Изменить действие с помощью внедрения зависимостей ASP.Net Core MVC

Я пытаюсь выполнить действие 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

Как просто отредактировать заголовок и содержимое этого сообщения, не касаясь других полей?

Если Вам понадобится больше кода, дайте мне знать.

Мы не знаем, что находится в вашей переменной post (внутри действия Edit(Post post), и мы не знаем, как выглядит ваш метод _postService.Update(post), поэтому невозможно определить, в чем проблема.

Christoph Lütjen 04.04.2021 19:16

Я просто редактирую вопрос и добавляю нужный вам код. Я включил код для метода Update

Piotr 04.04.2021 19:30

@Piotr Пожалуйста, проверьте stackoverflow.com/questions/4660142/…, чтобы узнать, как исправить исключения NullReferenceExceptions.

Progman 04.04.2021 19:52

@Piotr Добро пожаловать в Stack Overflow. Пожалуйста, возьмите тур, чтобы узнать, как работает Stack Overflow, и прочитайте Как спросить о том, как улучшить качество вашего вопроса. Затем редактировать ваш вопрос, чтобы включить полный исходный код, который у вас есть как минимальный воспроизводимый пример, который может быть скомпилирован и протестирован другими. Код, который вы предоставили, является неполным, поскольку исключение исходит от HomeController и его страницы просмотра.

Progman 04.04.2021 19:59

@Progman Почему вы перенаправляете меня на другой вопрос, который не очень связан с моей проблемой? Мой вопрос о передаче или непрохождении определенных значений полей. Которые заявлены в Model. Простой вопрос, мужик. Я новичок в этой технологии, поэтому я здесь, чтобы спросить других

Piotr 04.04.2021 20:00

@Piotr Пожалуйста, проверьте stackoverflow.com/questions/13402227/…, чтобы узнать, как передавать переменные / значения из вашей модели, которые нельзя напрямую редактировать в вашей HTML-форме (например, id).

Progman 04.04.2021 20:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не передаете userId в действие Edit при публикации формы, поэтому, когда вы обновляете Post post, UserId будет нулевым. Вы можете добавить скрытый ввод с помощью в вашу форму Edit View:

<input asp-for = "User.Id" type = "hidden" />

Таким образом, у вас будет идентификатор пользователя в Post post вашего действия Edit, а затем вы можете сохранить его в db.

Другие вопросы по теме