【问题标题】:ASP.NET Core how to pass List<int> from view to ControllerASP.NET Core 如何将 List<int> 从视图传递到控制器
【发布时间】:2020-06-22 21:14:16
【问题描述】:

在 ASP.NET Core 中,我四处搜索,但无法弄清楚如何将列表从视图传递到控制器。我可以创建一个 form 并传递一个 int 值,但不能创建一个 List&lt;int&gt;。这是我必须传递一个值

<form id="myForm">
    <div class="modal-body">
        <div class="form-group">
           <label class="custom-label">
           <div class="col-sm-3">
               <input name="singleValue" type="text" class="form-control" />
           </div>
        </div>
        <a href="#" class="btn btn-success" onclick="SaveForm('UpdateFunction', 'ControllerName')">Update</a>
</form>

我的控制器是

public IActionResult UpdateFunction(int singleValue)
{
    var model = _context.TableName.SingleOrDefault(f => f.Id == singleValue);
    model.Name = "Whatever";
    _context.Update(model);
    _context.SaveChanges();

    return Json(true);
}

但是因为我想一次更新多个值而不是只更新int singleValue,所以我尝试通过

public IActionResult UpdateFunction(int[] list)public IActionResult UpdateFunction(List&lt;int&gt; list)

进入函数参数。我尝试在文本框中输入多个 int 值,带/不带逗号、方括号,没有任何效果,列表始终为空。我的目标是将列表或数组传递给控制器​​,然后遍历列表中的值。我的问题是如何将List&lt;int&gt; 传递给控制器​​?

【问题讨论】:

  • 如何在表单中获取多个值?单个字段或多个字段。
  • 据我所知你不能这样做。我可以提供的唯一解决方案是您可以创建一个输入,用户可以在其中输入数字,例如:“1 2 5 6 7 8”,并且在您的控制器中您可以接受一个字符串,您可以将其转换为列表
  • @TheVillageIdiot 我会尝试在表单中添加类似 [1,2,3,4] 或 1,2,34,甚至 1 2 3 4 的内容,只是为了尝试不同的东西
  • 好的,我在回答中为您列出了几个选项,

标签: c# asp.net


【解决方案1】:

以下是您的几个选择:

  1. 如果您有多个文本输入来从用户那里获取多个数字,那么您可以使用HttpContext.Request.Form[&lt;FieldName&gt;] 等表单对象访问这些输入。

  2. 您可以在单个文本框中使用逗号或空格分隔多个值。验证会很痛苦,但是您可以获取字符串,将其切入控制器并使用它。

    public IActionResult UpdateFunction(string multipleValues)
    {
           var ints = multipleValues.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
    }
    
  3. 使用自定义对象传回值。但是您必须在客户端上创建 json 对象并使用 AJAX(jQuery ?)回发。

    public class ListOfInts
    {
           List<int> Ids{get;set;}
    }
    

在视图中:

   <script>
          $(function(){
                 $("#btn").click(function(){
                        var o={};
                        o.Ids = [<get values from inputs and];
                        $.ajax({....});
                 });
          });
   </script>

所有这些都需要一些工作才能真正实现(我需要一杯咖啡),但这会给你一个想法。

【讨论】:

  • 我最终选择了选项 2。
【解决方案2】:

文本类型的输入提供单个值。你不能在里面放一个列表。 在您的表单中,您输入了名称“singleValue”。

发布表单时 - 模型绑定机制尝试将表单数据绑定到操作方法的参数,在您的情况下为 UpdateFunction。

如果您想使用带有“1;2;3”之类的值的文本类型输入并将其视为列表 - 我认为更好的选择是使用 javaScript。从表单中收集您的值,进行预处理并将请求发送到服务器。

另一方面 - 您可以构建您的 viewModel,其中包含一个列表 - 例如 myList。 对于列表中的每一项,您都可以通过 foreach 循环创建一个输入。输入的名称应该是 myList[0]、myList[1]、myList[2] 等。 当您发布表单时,您在输入中指定的值将分别存储在 myList[index] 中。

【讨论】:

    【解决方案3】:

    我认为控制器的实现存在问题。 您需要添加 [FromBody] 标签才能从请求正文中获取值。

    喜欢

    public IActionResult UpdateFunction([FromBody] List<int>myValues)
    {
        //Your code here..
    }
    

    【讨论】:

    • Asp net Core 足够聪明,可以判断它需要从请求体中绑定一个列表
    • 我以前也遇到过类似的问题,有时需要指出来。
    • 我试过FromBody它没有帮助,我想我会尝试传递一个字符串而不是List&lt;int&gt;然后将它转换为List
    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多