asp.net 我在Dbset中的更新方法不起作用,它只是在数据库中添加另一行

vm0i2vca  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(162)

我试图学习网站开发与asp.net 6,我试图更新我创建的一个类别。我写了一个获取和发布方法,但它只是不工作的编辑行动,它是在数据库中添加一个新的行,而不是更新。
这是我在分类控制器中的编辑操作

//GET
        public IActionResult Edit(int? id)
        {
            if(id == null || id == 0)
            {
                return NotFound();
            }
            var CategoryFromDb = _db.Categories.Find(id);
            if (CategoryFromDb == null)
            {
                return NotFound();
            }
            return View(CategoryFromDb);
        }

        //POST
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Edit(Category obj)
        {
            if (obj.Name == obj.DisplayOrder.ToString())
            {
                ModelState.AddModelError("name", "The DisplayOrder cannot exactly match the Name.");
            }
            if (ModelState.IsValid)
            {
                _db.Categories.Update(obj);
                _db.SaveChanges();
                return RedirectToAction("Index", "Category");
            }
            return View(obj);
        }
    }

这是我的编辑.cshtml

@model Category

<form method="post" asp-action="Edit">
    <div class="border p-3 mt-4">
        <div class="row pb-2">
            <h2 class="text-primary">Edit Category</h2>
            <hr/>
            <div asp-validation-summary="All"></div>
        </div>
        <div class="mb-3" style="  width: 500px;clear: both;">
            <label asp-for="Name"></label>
            <input style="width: 100%;clear: both;" asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-bg-danger"></span>
        </div>
        <div class="mb-3" style="  width: 500px;clear: both;">
            <label asp-for="DisplayOrder"></label>
            <input style="width: 100%;clear: both;" asp-for="DisplayOrder" class="form-control" />
            <span asp-validation-for="DisplayOrder" class="text-bg-danger"></span>

        </div>
        <button type="submit" class="btn btn-primary" style="width:150px;">Update</button>
        <a asp-controller="Category" asp-action="Index" class="btn btn-secondary" style="width:150px">Back to List</a>
    </div>
</form>

这是我的分类模型

public class Category
    {

        [Key]
        public int? CategoryID { get; set; }

        [Required]
        public string Name { get; set; }

        [DisplayName("Display Order")]
        [Range (1,100,ErrorMessage ="Not in Range of Display Order")]
        public int DisplayOrder { get; set; }
        public DateTime CreatedDateTime { get; set; } = DateTime.Now;
    }

这是我创建的索引视图部分编辑按钮

<div class="w-75 btn-group" role="group">
                            <a asp-controller="Category" asp-action="Edit" asp-route-id ="@obj.CategoryID" ><i class="bi bi-pencil"></i>Edit</a>
                    </div>

并且它正在向数据库添加新行,而不是基于主键更新数据库,请帮助我...谢谢

xxls0lw8

xxls0lw81#

您的主要问题是您没有正确填充模型-也就是说,您的视图没有填充CategoryID,因此控制器不“知道”要更新哪个Category。您需要修改您的视图,如下所示(我在<form>的正下方添加了一行):

@model Category

<form method="post" asp-action="Edit">
    @Html.HiddenFor(m => m.CategoryID)
    <div class="border p-3 mt-4">
        <div class="row pb-2">
            <h2 class="text-primary">Edit Category</h2>
            <hr/>
            <div asp-validation-summary="All"></div>
        </div>
        <div class="mb-3" style="  width: 500px;clear: both;">
            <label asp-for="Name"></label>
            <input style="width: 100%;clear: both;" asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-bg-danger"></span>
        </div>
        <div class="mb-3" style="  width: 500px;clear: both;">
            <label asp-for="DisplayOrder"></label>
            <input style="width: 100%;clear: both;" asp-for="DisplayOrder" class="form-control" />
            <span asp-validation-for="DisplayOrder" class="text-bg-danger"></span>

        </div>
        <button type="submit" class="btn btn-primary" style="width:150px;">Update</button>
        <a asp-controller="Category" asp-action="Index" class="btn btn-secondary" style="width:150px">Back to List</a>
    </div>
</form>

相关问题