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