Return 从视图到控制器剃刀页面的 ViewData

Return ViewData from view to controller razor pages

我的观点是 C#:

@{
    var itemList = (List<Item>)ViewData["itemsList"];
}
<div class="row" style="margin-top: 10px;">
    <div class="col-md-6">
        @if (itemList != null)
        {
            var id = 0;
            <table class="table table-striped">
                <thead>
                <tr>
                    <th>#</th>
                    <th></th>
                    <th>Id</th>
                    <th>Type</th>
                </tr>
                </thead>
                <tbody>
                    @foreach (var result in itemsList)
                    {
                        <tr>
                            <td>@(++id)</td>
                            <td><input type="checkbox" value="true" @(result.Checked ? "checked" : "")></td>
                            <td>@result.Id</td>
                            <td>@result.Type</td>
                        </tr>
                    }
                </tbody>
            </table>
        }
        <div class="row justify-content-end" style="margin-top: 20px;">
            <div class="col-md-2">
                <form asp-controller="Control" asp-action="Remove" method="post">
                    <input type="hidden" name="tableName" value="table"/>
                    <input type="hidden" name="items" value="@itemList"/>
                    <div style="margin-left: -10px;" class="col-md-2">
                        <button class="btn btn-danger" title="Remove" type="submit">Remove</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

我想从 table 中删除项目,其中用户选中了复选框。我的想法是用列表 (result.Checked 属性) 更新每个选中的项目,然后将数组发送到 Remove 方法:

[HttpPost]
public async Task<IActionResult> Remove(string tableName, List<ChangeQueueItem> items)
{
    try
    {
        var toDelete = items.Where(x => x.Checked == true);

        await _repository.RemoveFromQueue(toDelete, tableName);
    }
    catch (Exception e)
    {
        TempData["error"] = e.Message;
    }
    return RedirectToAction("Index");
}

我正在尝试像这样发送该列表:

<input type="hidden" name="items" value="@itemList"/>

但是值为空。我应该怎么做?

更新:数据加载到这里:

[HttpGet]
public async Task<IActionResult> Index()
{
     var items = await _repository.GetAll();
     
    ViewData["itemsList"] = items;
    ViewData["error"] = TempData["error"];

    return View("Index");
}

您似乎没有设置 TempData["itemList"];我在代码中看不到它。

您应该使用如下方式设置它:

TempData["itemList"] = toDelete;

首先, 您使用 ViewData["itemsList"] = items; 设置值,但通过 var itemList = (List<Item>)ViewData["itemList"];.

获取它

更改键值使其保持一致:例如,将视图中的itemList替换为itemsList

其次, 将列表从视图传递到控制器操作方法将索引应用于项目(仅显示 <tbody> 内容):

<tbody>
    @using (Html.BeginForm("Remove", "Control"))
    {
        @Html.Hidden("tableName", "table")
        @for (int i = 0; i < itemsList.Count; i++)
        {
            @Html.Hidden("items[" + i + "].Id", itemsList[i].Id)
            @Html.Hidden("items[" + i + "].Type", itemsList[i].Type)
            <tr>
                <td>@(++id)</td>
                <td>@Html.CheckBox("items[" + i + "].Checked", itemsList[i].Checked)</td>
                <td>@itemsList[i].Id</td>
                <td>@itemsList[i].Type</td>
            </tr>
        }
        <tr><td><button class="btn btn-danger" title="Remove" type="submit">Remove</button></td></tr>
    }
</tbody>

或者没有助手也一样(只显示<tbody>内容):

<tbody>
    <form asp-controller="Control" asp-action="Remove" method="post">
        <input type="hidden" name="tableName" value="table" />

        @for (int i = 0; i < itemsList.Count; i++)
        {
            <input type="hidden" name="@("items[" + i + "].Id")" value="@itemsList[i].Id" />
            <input type="hidden" name="@("items[" + i + "].Type")" value="@itemsList[i].Type" />
    <tr>
        <td>@(++id)</td>
        <td><input  name="@("items[" + i + "].Checked")" type="checkbox" value="true" @(itemsList[i].Checked ? "checked" : " ") /></td>
        <td>@itemsList[i].Id</td>
        <td>@itemsList[i].Type</td>
    </tr>
        }
        <tr><td><button class="btn btn-danger" title="Remove" type="submit">Remove</button></td></tr>
    </form>
</tbody>