Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MVC视图中批量更新表,而不是一次更新一条记录?_C#_Jquery_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# 如何在MVC视图中批量更新表,而不是一次更新一条记录?

C# 如何在MVC视图中批量更新表,而不是一次更新一条记录?,c#,jquery,asp.net-mvc,asp.net-mvc-5,C#,Jquery,Asp.net Mvc,Asp.net Mvc 5,我用所示的措辞提出问题,以表明我真正想做的事情。虽然我可以提出这样一个问题,“如何使用jQuery读取表的内容并将其转换为类型IEnumerable?”但我会隐藏一些重要的上下文,这些上下文可能会建议一种更好的方法来实现这一结果,这正是我真正希望的 从模型(使用实体框架)自动构建控制器和视图时,生成的视图允许用户通过单击行、编辑记录并返回索引,一次编辑一条记录。在许多情况下,这是理想的功能 但是,当一个人想要大量更新表中的值时,就像在处理电子表格一样,又该怎么办呢。例如,切换一些复选框并单击“更

我用所示的措辞提出问题,以表明我真正想做的事情。虽然我可以提出这样一个问题,“如何使用jQuery读取表的内容并将其转换为类型
IEnumerable
?”但我会隐藏一些重要的上下文,这些上下文可能会建议一种更好的方法来实现这一结果,这正是我真正希望的

从模型(使用实体框架)自动构建控制器和视图时,生成的视图允许用户通过单击行、编辑记录并返回索引,一次编辑一条记录。在许多情况下,这是理想的功能

但是,当一个人想要大量更新表中的值时,就像在处理电子表格一样,又该怎么办呢。例如,切换一些复选框并单击“更新”,如本场景中所示

我的一个工作思路是使用jQuery:

  • 读取表格数据并将其转换为
    IEnumerable
    类型的变量
  • 将表内容传递给控制器中的公共void方法
  • 通知用户操作已成功并刷新页面
  • 我真的陷入了困境,因为我需要能够将类型为
    IEnumerable
    的对象传递给控制器的方法,而我不知道如何做到这一点

    控制器:

    public void UpdateTable(IEnumerable<SampleModel> query)
    {
        // I'm verifying existence before writing code here.
        // This is where I'll be updating the database.
        Debug.WriteLine("Test for query existence " + query.Count());
    }
    
    public void UpdateTable(IEnumerable查询)
    {
    //在这里编写代码之前,我正在验证是否存在。
    //这是我更新数据库的地方。
    Debug.WriteLine(“测试查询是否存在”+query.Count());
    }
    
    视图:

    @model SampleSystem.Areas.FakeName
    更新
    @DisplayNameFor(model=>model.Reconciled)
    @DisplayNameFor(model=>model.StudentID)
    @foreach(模型中的var项目)
    {
    @Html.HiddenFor(modeleItem=>item.ID)
    @CheckBoxFor(modelItem=>item.Reconfied)
    @DisplayFor(modeleItem=>item.StudentID)
    }
    @节脚本{
    $(函数(){
    $(“UpdateTableTop”)。单击(函数(e){
    $.ajax({
    url:“@url.Action(“UpdateTable”)”,
    数据:
    /*…需要转换表
    *为了数不清。。。
    */,
    成功:函数(){
    console.log(“成功!”);
    }
    });
    });
    });
    }
    
    这不是一个完整的答案,但应该会引导您走向正确的方向

            $("UpdateTableTop").click(function (e) {                
               var selectedModels = [];
    
               // Get all of the rows that were selected
    
               // Loop through each row, create an object and add to array
               for(var i = 0; i < numItemsSelected; i++)
               {
                  // Make sure the properties of the model match your definition of SampleModel
                   var currentModel = {
                                          Reconciled = ??? , //Reconciled from the current row
                                          StudentID = ???
                                       };
                   selectedModels.push(currentModel);
               }
    
                $.ajax({
                    url: '@Url.Action("UpdateTable")',
                    data: /* pass in the list of models (selectedModels) */,
                    success: function (){
                        console.log("Success!");
                    }
                });
            });
    
    $(“UpdateTableTop”)。单击(函数(e){
    var selectedModels=[];
    //获取选定的所有行
    //循环遍历每一行,创建一个对象并添加到数组中
    对于(变量i=0;i

    在服务器端,模型绑定将负责根据发布的值创建
    SampleModel

    除了前面的答案之外,还有一种可能的方法。 将数据属性添加到复选框

    @Html.CheckBoxFor(modelItem => item.Reconciled, new { data_myid = item.ID }) /* the _ gets converted to - */
    
    稍后,使用jQuery检索所有选中的复选框

    var selectedIds = new Array();
    $( "input:checked" ).each(function(eachCheckbox){
        selectedIds.push($(eachCheckbox).data('myid'));// could serialize to JSON but if the update action is the same for all id's then there is no need for additional data transfer
    });
    
    然后在ajax调用中将所选的EDID作为数据传递,并在成功时通知

    在服务器端:

    public void UpdateTable(IEnumerable<int> query) /* change type to int */
    {
        Debug.WriteLine("Test for query existence " + query.Count());
    }
    
    public void UpdateTable(IEnumerable查询)/*将类型更改为int*/
    {
    Debug.WriteLine(“测试查询是否存在”+query.Count());
    }
    
    对于数据,您可以将格式正确的JSON传递给控制器。我不明白,为什么不将整个表包装成一个表单,然后提交所有值?你需要jQuery做什么?@FrancescoLorenzetti84——简单的回答是因为它比你知道的要复杂。我试图让事情变得足够简单,以避免人们抱怨我不应该发布太多代码使用
    for
    循环或自定义
    编辑器模板
    (请参阅)正确生成视图,然后只需
    数据:$('form')。serialize()
    在ajax选项中正确序列化表单并将其发回控制器。您需要将该方法修改为
    public JsonResult UpdateTable(IEnumerable查询)
    并将某些内容返回给客户端(例如
    Json(true);
    假设成功)。但是你到底为什么要刷新页面呢?在这种情况下,我需要捕获整个表以捕获选中和未选中的值。尽管如此,它还是给了我一种方法。我现在更喜欢你的方法,但是当我对
    console.log($(eachCheckbox.data('myid'))进行控制台测试时我在每个复选框中得到的是“未定义”,而不是行ID。从函数签名中删除参数eachCheckbox,并在push语句中用$(this)替换它。数据('myid')Rubix_复仇:很高兴听到它对您有效@JB06谢谢修复。
    
    public void UpdateTable(IEnumerable<int> query) /* change type to int */
    {
        Debug.WriteLine("Test for query existence " + query.Count());
    }