为啥数据不从视图传递到控制器

Posted

技术标签:

【中文标题】为啥数据不从视图传递到控制器【英文标题】:Why is data not passed from view to controller为什么数据不从视图传递到控制器 【发布时间】:2021-11-29 13:06:39 【问题描述】:

我有一个 Razor 视图,在表格中列出了假日公园的住宿。用户 - 公园管理员 - 已决定应该删除这些,现在按下删除按钮。然后必须将所有列出的住宿的 ID 传递给控制器​​,但不知何故它们没有到达,我无法确定为什么不到达。这是视图的代码:

@model SunnySideWebManagement.ViewModels.HomeAccomodationsViewModel

@
    ViewBag.PageTitle = "Remove these accomodations?";
    int[] removeIds = new int[Model.Accomodations.Count()];


<form asp-controller="home" asp-action="removeaccomodation" asp-route-removeIds="@removeIds" method="post" class="mt-10">
    <div class="form-group row">
        <table id="accomodationsTable" class="row-border">
            <thead>
                <tr><th>Id</th><th>Number</th><th>Remarks</th><th>Currently booked</th></tr>
            </thead>
            <tbody>
                @
                    int index = 0;
                    foreach (var ac in Model.Accomodations)
                    
                        removeIds[index] = ac.Id;
                        index++;
                        <tr><td>@ac.Id</td><td>Number</td><td>@ac.Remarks</td><td>@ac.CurrentlyBooked</td></tr>
                    
                
            </tbody>
        </table>
    </div>
    <div class="form-group row">
        <div class="col-sm-10">
            <button type="submit" class="btn btn-primary">Remove</button>
            <a asp-controller="home" asp-action="accomodations" class="btn btn-primary">Cancel</a>
        </div>
    </div>
</form>

如您所见,我声明了一个 int 数组 removeIds 并在表格填满时非常简单地填充它。 removeIds 接收到正确的值。 Remove 按钮单击正确调用 HomeController.cs 中的以下代码,如 &lt;form ...&gt; 元素中所定义:

[HttpPost]
public IActionResult RemoveAccomodation(int[] removeIds)

    for (int i = 0; i < removeIds.Length; i++)
    
        _accomodationRepository.Delete(removeIds[i]);
    
    return RedirectToAction("accomodations");

这里的断点表明 removeIds 是一个空数组 - 它的值发生了什么变化?我忽略了什么,或者我做错了什么?

【问题讨论】:

你需要在RemoveAccomodation方法之上声明这样的路由[Route("&lt;ControllerName&gt;/removeIds:int[]")] 【参考方案1】:

使用提交您只能发布视图模型,而不能发布其他任何内容,我认为在视图内创建 removeIds 没有任何意义,因为您没有选择任何内容。由于您使用的是表单和提交按钮,因此您的整个模型无论如何都会被提交,无论您是否使用 asp-route 都没关系。所以删除 asp-route-removeIds="@removeIds" 并修复操作。

[HttpPost]
public IActionResult RemoveAccomodation(HomeAccomodationsViewModel  model)

int[] removeIds = Model.Accomodations.Select(i=> i.Id).ToArray();

 for (int i = 0; i < removeIds.Length; i++)
    
        _accomodationRepository.Delete(removeIds[i]);
    
    return RedirectToAction("accomodations");

PS。

如果您只想提交 Id,则必须使用 ancor 标签而不是表单,或者创建具有 id 数组的特殊视图模型。如果要在 ancor 中使用 id,则必须在创建 ancor 之前填写所有 Id,或者使用 javascript。但是您现在的代码没有多大意义。

PS2

如果您仍想退回所有住宿项目,则必须使用 for 循环而不是 foreach 循环

  @for (var i=0; i <  Model.Accomodations.Count; i++)
 
                      
 <tr><td>@Model.Accomodations[i].Id</td><td>Number</td>
<td>@Model.Accomodations[i].Remarks</td>
<td>@Model.Accomodations[i].CurrentlyBooked</td></tr>
 

但您可以只使用 I 从 db 获取所有住宿。

【讨论】:

是的,这是有道理的——我猜是生活'n'学习。 ? 知道为什么 model 参数中的 Accomodations 可能为空,即使视图显示了几个? 您建议使用锚标记仅提交 Id 效果很好 - 但返回模型会使代码更优雅。 @Cooz 我更新了我的答案,见 PS2

以上是关于为啥数据不从视图传递到控制器的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Asp.net web api 控制器不从 IController 派生

如何快速将数据从视图控制器传递到容器视图

当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?

将数据从视图控制器传递到另一个视图控制器

如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?

如何将数据从表视图传递到另一个视图控制器