在 Asp.net MVC 中通过一个 Upsert 操作在同一模式上创建类别后,无法通过 id 编辑类别

问题描述 投票:0回答:1

问题是成功创建后,当我悬停“编辑”按钮时,链接正确显示,但是当我单击“编辑”按钮时,它显示“添加新类别”,这意味着创建功能,而不是显示我要更改的类别名称。如何解决这个问题呢? 当我单击编辑按钮而不是创建时,我想在同一模式上编辑类别。

在 Index.cshtml 中:

@model IEnumerable<Category>

<div class="container mt-4">
    <div class="card">
        <div class="card-header d-flex justify-content-between align-items-center">
            <h5 class="mb-0">Categories Data</h5>
            <a asp-controller="Category" asp-action="Upsert" class="btn btn-primary" style="box-shadow: none" data-bs-toggle="modal" data-bs-target="#categoryModal">
                <i class="fas fa-plus-circle"></i> &nbsp;Add Category
            </a>

            <!-- Modal for Create/Update Category -->
            <div class="modal fade" id="categoryModal" tabindex="-1" aria-labelledby="categoryModalLabel" aria-hidden="true">
                <div class="modal-dialog modal-dialog-centered" role="document">
                    <div class="modal-content">
                        <form asp-controller="Category" asp-action="Upsert" method="post">
                            <div class="modal-header">
                                <h5 class="modal-title" id="categoryModalLabel">
                                    @if (TempData["CategoryId"] != null)
                                    {
                                        <span>Edit Category</span>
                                    }
                                    else
                                    {
                                        <span>Add New Category</span>
                                    }
                                </h5>
                                <button type="button" style="box-shadow: none" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                            </div>
                            <div class="modal-body">
                                <!-- Hidden Field for Id -->
                                <input type="hidden" id="Id" name="Id" value="@(TempData["CategoryId"] ?? Guid.Empty.ToString())" />


                                <div class="mb-3">
                                    <label for="CategoryName" class="form-label fw-bold ms-1">Category Name</label>
                                    <input type="text" class="form-control" id="CategoryName" name="CategoryName"
                                           value="@TempData["CategoryName"]" required placeholder="Category Name" />
                                </div>
                            </div>
                            <div class="modal-footer">
                                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Dismiss</button>
                                <button type="submit" class="btn btn-success">Save</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>

        <div class="card-body">
            <table class="table table-bordered">
                <thead class="thead-light">
                    <tr>
                        <th>S/N</th>
                        <th>Category Name</th>
                        <th>Created At</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                    @{
                        int index = 1;
                    }
                    @foreach (var category in Model)
                    {
                        <tr>
                            <td>@index</td>
                            <td>@category.CategoryName</td>
                            <td>@category.CreatedAt.ToString("yyyy-MM-dd")</td>
                            <td>
                                <a asp-controller="Category" asp-action="Upsert" asp-route-id="@category.Id"
                                   class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#categoryModal">Edit</a>
                            </td>
                        </tr>
                        index++;
                    }
                </tbody>
            </table>
        </div>
    </div>
</div>

在类别控制器中:

// GET: Upsert action to prepare the modal for edit or creation
[HttpGet]
public IActionResult Upsert(Guid? id)
{
    Category category = new Category();
    if (id.HasValue)
    {
        category = _unitOfWork.Category.Get(c => c.Id == id.Value);
        if (category == null)
        {
            return NotFound();
        }
    }

    // Store the retrieved category or new category in TempData
    TempData["CategoryId"] = category.Id;
    TempData["CategoryName"] = category.CategoryName;

    // Redirect to Index to open the modal with the data
    return RedirectToAction("Index");
}
c# asp.net asp.net-mvc asp.net-core bootstrap-modal
1个回答
0
投票

这可能是由于缓存造成的。对当前编辑的项目使用

TempData
也不是一个好的选择。

考虑使用一个包含结果集合的包装模型以及当前编辑的

Category? EditingCategory

public class CategoryIndexViewModel
{
    public Category? EditingCategory { get; set;} = null;
    public ICollection<Category> Results { get; set; } = [];
}

...然后使用可选的

int? Id
设置索引,如果存在,则会将该 EditingCategory 加载到模型中以将编辑控件绑定到。这样,您的 URL 将类似于:“/Category/Index”,用于“未选择任何内容”场景,其中点击类别 ID aaaa-bbbb-ccccc... 上的“编辑”按钮将转到 URL“/Category/Index?” aaaa-bbbb-ccccc...”向服务器/浏览器表明这是不同的页面/内容。 编辑超链接仅指向具有所选 ID 的索引,而不是重定向到“索引”的“Upsert”GET:

<a asp-controller="Category" asp-action="Index" asp-route-id="@category.Id" ...

通常情况下,我会考虑 AJAX 调用,其中客户端 JS 处理链接操作,并动态设置模式的内容并显示它,同时也通过 AJAX 异步处理更新和刷新。这将涉及将锚点 href 设置为“#”,并绑定一个单击事件来启动从服务器的异步 GET 获取,返回包含数据的响应以组成视图或视图引擎呈现的 HTML。然后进入模态内容

<div>
并显示模态。这比重新定向再次加载整个页面并在浏览器中运行缓存优化更具响应性。

© www.soinside.com 2019 - 2024. All rights reserved.