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>
我的观点是 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>