ASP.NET Core如何从视图传递List<int>到控制器

3
在ASP.NET Core中,我已经搜索过但无法弄清如何从视图传递列表到控制器。我可以创建一个form并传递单个int值,但无法传递List<int>。以下是用于传递单个值的内容:
<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<int> list)

进入函数参数。我尝试在文本框中输入多个int值,带/不带逗号、括号,但都无效,列表始终为空。我的目标只是将列表或数组传递给控制器,然后循环遍历列表中的值。我的问题是如何将List<int>传递给控制器?


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

2

以下是您的几个选项:

  1. If you have multiple text inputs to get multiple numbers from user then you can access those using form object like HttpContext.Request.Form[<FieldName>].

  2. You can get multiple values in single text box with a comma or a space separating those. Validation will be a pain, but you can then get the string, chop it in controller and use it.

    public IActionResult UpdateFunction(string multipleValues)
    {
           var ints = multipleValues.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
    }
    
  3. Use custom object to pass values back. But you have to create json object on client and post back using 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>

所有这些都需要一些工作来实际实现(而且我需要一杯咖啡),但这会给你一个想法。

1
我最终选择了第二个选项。 - jaabh

1

文本输入框提供单个值。您不能在其中放置列表。 在您的表单中,有一个名为“singleValue”的输入。

当提交表单时,模型绑定机制尝试将表单数据绑定到操作方法的参数上,这在您的情况下是UpdateFunction。

如果您想要使用类型为文本的输入,并且其值类似于“1;2;3”,并将其视为列表-在我看来,更好的选项是使用JavaScript。从表单中收集您的值,进行预处理,然后将请求发送到服务器。

另一方面,您可以构建具有列表的viewModel,例如myList。对于列表的每个项目,您都可以通过foreach循环创建一个输入。输入的名称应分别为myList [0],myList [1],myList [2]等。 当您提交表单时,您在输入中指定的值将分别存储在myList [index]中。


0

我认为控制器的实现存在问题。你需要添加[FromBody]标记来从请求正文获取值。

像这样:

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

Asp net Core 足够智能,可以确定它需要从请求体绑定一个列表。 - Neistow
我之前也遇到过类似的问题,有时需要指出来。 - Arthur Cam
我尝试了 FromBody,但没有帮助,我想我会尝试传递一个字符串而不是 List<int>,然后将其转换为 List - jaabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接