使用依赖注入编辑操作 ASP.Net Core MVC

Edit action with Dependency Injection ASP.Net Core MVC

我正在尝试使用 DI 进行编辑操作。

我正在使用 管理 查看以编辑或删除 objects。

我Post接口:

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

Post服务更新方法:

public void Update(Post post)
        {
            _context.Posts.Update(post);
            _context.SaveChanges();
        }

Post控制器编辑 GET 和 POST 操作:

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

Post 模型 UpdateEdit 方法指的是:

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>

我遵循此 tutorial 并且无法替换 postId - 它正在创建新 ID,并且无法传递 non-edited 值,例如 userId/UserName.

当我确认编辑后 post 我从数据库中得到 NullReferenceException - errorpage

这是我table“改变”后的观点-DBtable

如何在不触及其他字段的情况下仅编辑此 post 的标题和内容?

如果您需要更多代码,请告诉我。

当你 post 你的表单时,你没有将 userId 传递给 Edit 操作,所以当你更新 Post post 时,UserId 将是 null.You 可以添加隐藏输入使用您的编辑视图表单:

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

这样您的编辑 Post post 中就会有用户 ID action.And 然后您可以将其保存到数据库中。