• .NET Conf China
...

ASP.NET MVC4 如何批量修改?

MR00009 2014-06-26 11:34:06
如何从视图传递一个List到控制器?

具体功能是这样的:

从控制器获取到数据(List<T>),传递到视图,在视图中循环输出成列表。
而列表里每一行的每一个参数都是Html.TextBox,可以任意修改。

现在要点击提交修改按钮后,将整个列表传回控制器。传递单行数据可以用FormCollection,整个列表呢?
因为列表中使用了拖拽排序,所以必须整个列表传回来提交修改。
...全文
给本帖投票
1304 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
MR00009 2014-07-03
  • 打赏
  • 举报
回复
引用 16 楼 xxoome 的回复:
刚做了一个mvc4的批量操作,帮你写个大概,主要看思路 不管你怎么写吧,前台拼接一个你要处理的所有数据的json 串,ajax发送后台接受处理,返回一个json结果,方便前端提示,或弹错

前台cshtml
var y=[1,2,3];// js直接操作获取你要修改产品ID,假设这里是1,2,3
       //拼接json数据
        var jsonstr = GetJson(ids);

        function GetJson(ids)
        {
            var jsonstr = '[';
            var bsku;
            for (var i = 0; i < ids.length; i++) {
                    jsonstr += '{';
                    jsonstr += "'id':'" + id+ "',";
                    jsonstr += '}'
                    jsonstr += ','

            }
            jsonstr = jsonstr.substring(0, jsonstr.length - 1);
            jsonstr += ']';
            return jsonstr
        }
        //ajax发送json,请求后台处理
        $.post("/Print/HandleJson", { jsons: jsonstr }, function (js) {
            var jsonData = eval("(" + js + ")");//还可以接受后台返回的json结果

        });   
       //Control 控制器 写个接收方法
        public JsonResult HandleJson(FormCollection c)
        {
            string strjson = c["jsons"];
            JArray ja = (JArray)JsonConvert.DeserializeObject(strjson);//获取前台json数据
	    int s_id=0;
	     foreach(JObject jb in ja)
             {
		s_id = Convert.ToInt32(jb["id"].ToString());

		//得到id 做你的修改动作
             }

         }

嗯,我就是先这样子做了。前台提交前拼接,后台再拆。就是感觉这样太粗鲁,看有没有更好的办法。
骑猪看海 2014-07-01
  • 打赏
  • 举报
回复
这种操作直接找个jq.grid 获取到JSON字符串传递到后台反序列化成对象集合,入库,自己写主要是前台JS代码,太麻烦了,所以还是直接找组件,方便
wuzhanhui 2014-07-01
  • 打赏
  • 举报
回复
我现在在路上 2014-07-01
  • 打赏
  • 举报
回复
引用 10 楼 lizeyuan8238386 的回复:
[quote=引用 5 楼 lizeyuan8238386 的回复:] 直接提交表单就可以了,会自动映射的
引用 6 楼 ta_wuhen 的回复:
[quote=引用 5 楼 lizeyuan8238386 的回复:] 直接提交表单就可以了,会自动映射的
有的时候会有的时候就不会,不知道为什么、、、以前碰到过[/quote] 这个映射一个list 话 控件的name是有规律的,细心点就可以发现的[/quote] 我知道和生成的name有关,但是我用的是@html.出来的东东,有时候不生成Name等属性
十三- 2014-07-01
  • 打赏
  • 举报
回复
刚做了一个mvc4的批量操作,帮你写个大概,主要看思路 不管你怎么写吧,前台拼接一个你要处理的所有数据的json 串,ajax发送后台接受处理,返回一个json结果,方便前端提示,或弹错

前台cshtml
var y=[1,2,3];// js直接操作获取你要修改产品ID,假设这里是1,2,3
       //拼接json数据
        var jsonstr = GetJson(ids);

        function GetJson(ids)
        {
            var jsonstr = '[';
            var bsku;
            for (var i = 0; i < ids.length; i++) {
                    jsonstr += '{';
                    jsonstr += "'id':'" + id+ "',";
                    jsonstr += '}'
                    jsonstr += ','

            }
            jsonstr = jsonstr.substring(0, jsonstr.length - 1);
            jsonstr += ']';
            return jsonstr
        }
        //ajax发送json,请求后台处理
        $.post("/Print/HandleJson", { jsons: jsonstr }, function (js) {
            var jsonData = eval("(" + js + ")");//还可以接受后台返回的json结果

        });   
       //Control 控制器 写个接收方法
        public JsonResult HandleJson(FormCollection c)
        {
            string strjson = c["jsons"];
            JArray ja = (JArray)JsonConvert.DeserializeObject(strjson);//获取前台json数据
	    int s_id=0;
	     foreach(JObject jb in ja)
             {
		s_id = Convert.ToInt32(jb["id"].ToString());

		//得到id 做你的修改动作
             }

         }

  • 打赏
  • 举报
回复
另外 不建议在循环中访问数据库
  • 打赏
  • 举报
回复
前台数据: 第一行 <input name="[0].ProductID" /> 第2行 <input name="[1].ProductID" /> 第3行 <input name="[2].ProductID" /> 提交下试试
  • 打赏
  • 举报
回复
引用 5 楼 lizeyuan8238386 的回复:
直接提交表单就可以了,会自动映射的
引用 6 楼 ta_wuhen 的回复:
[quote=引用 5 楼 lizeyuan8238386 的回复:] 直接提交表单就可以了,会自动映射的
有的时候会有的时候就不会,不知道为什么、、、以前碰到过[/quote] 这个映射一个list 话 控件的name是有规律的,细心点就可以发现的
小子哟 2014-06-27
  • 打赏
  • 举报
回复
Yy619804029 2014-06-27
  • 打赏
  • 举报
回复
var planlist = libManagementDB.BLL.DrawUpContractFilesSentManager.GetList(x => x.DrawUpContractId == drawUpContractId && x.TypeId == typeId); int index = 1; var tablename = "tabEditPlan" + typeId; var fname = ""; var datename = ""; var aname = ""; var remarkname = ""; <script type="text/javascript"> function addnewplan1() { var table = document.getElementById("tabEditPlan" + Number(@typeId)); var newindex = table.rows.length; var tr = table.insertRow(); var td0 = tr.insertCell(0); td0.innerHTML = newindex; var td1 = tr.insertCell(1); td1.innerHTML = '<input name="fname' + newindex + "_" + @typeId+'" type="text" class="input_class">'; var td2 = tr.insertCell(2); td2.innerHTML = '<input name="amount' + newindex + "_" + @typeId + '" type="text" class="input_class" style="width:35px">'; var td3 = tr.insertCell(3); td3.innerHTML = '<input name="subdate' + newindex + "_" + @typeId + '" type="text" onclick="WdatePicker();" class="Wdate">'; var td4 = tr.insertCell(4); td4.innerHTML = '<input name="remarkname' + newindex + "_" + @typeId + '" type="text" class="input_class">'; var td5 = tr.insertCell(5); td5.innerHTML = '<img src="/images/cancel.gif" style="cursor:pointer;" onclick="delplan1(' + newindex + ')" alt="删除" />'; td0.style["textAlign"] = "center"; td1.style["textAlign"] = "center"; td2.style["textAlign"] = "center"; td3.style["textAlign"] = "center"; td4.style["textAlign"] = "center"; td5.style["textAlign"] = "center"; } function delplan1(index) { var table = document.getElementById("tabEditPlan" + Number(@typeId)); table.deleteRow(index); for (i = 1; i < table.rows.length; i++) { table.rows[i].cells[0].innerHTML = i.toString(); table.rows[i].cells[5].innerHTML = '<img src="/images/cancel.gif" style="cursor:pointer;" onclick="delplan1(' + i + ')" />'; } } </script> <table id="@tablename" style="width:760px"> <tr> <td style="text-align:center;width:40px"><b>序号</b></td> <td style="text-align:center;width:25%"><b>资料及文件名称</b></td> <td style="text-align:center;width:8%"><b>份数</b></td> <td style="text-align:center;width:15%"><b>提交日期</b></td> <td style="text-align:center;width:30%"><b>备注</b></td> <td style="text-align:center;"><a onclick="addnewplan1();" style="cursor:pointer;"><img src="/images/add.gif" alt="添加" /></a></td> </tr> @if (planlist.Count == 0) { fname = "fname" + index + "_" + typeId; aname = "amount" + index + "_" + typeId; datename = "subdate" + index + "_" + typeId; remarkname = "remark" + index + "_" + typeId; <tr> <td style="text-align:center">@index</td> <td style="text-align:center"><input class="input_class" name="@fname" type="text" " ></td> <td style="text-align:center"><input name="@aname" type="text" " style="width:35px" class="input_class"></td> <td style="text-align:center"><input name="@datename" type="text" readonly="true" onclick="WdatePicker();" class="Wdate"></td> <td style="text-align:center"><input name="@remarkname" type="text" class="input_class" ></td> <td style="text-align:center"><img src="/images/cancel.gif" style="cursor:pointer;" alt="删除" title="2" onclick="delplan1('@index')"/></td> </tr> } @{ //int idefaultAmountTotal = 6; foreach (var item in planlist) { fname = "fname" + index + "_" + typeId; aname = "amount" + index + "_" + typeId; datename = "subdate" + index + "_" + typeId; remarkname = "remark" + index + "_" + typeId; <tr> <td style="text-align:center">@index</td> <td style="text-align:center"> <input class="input_class" name="@fname" type="text" value="@item.FileName" ></td> <td style="text-align:center"><input name="@aname" type="text" value="@item.Amount" class="input_class" style="width:35px"></td> <td style="text-align:center"><input name="@datename" type="text" readonly="true" value="@(item.SubDate == null || item.SubDate == "" ? "" : Convert.ToDateTime(item.SubDate).ToShortDateString())" onclick="WdatePicker();" class="Wdate"></td> <td style="text-align:center"><input name="@remarkname" type="text" value="@item.Remark" class="input_class" ></td> <td style="text-align:center"><img src="/images/cancel.gif" style="cursor:pointer;" alt="删除" title="2" onclick="delplan1('@index')"/></td> </tr> index = index + 1; } fname = "fname" + index + "_" + typeId; aname = "amount" + index + "_" + typeId; datename = "subdate" + index + "_" + typeId; remarkname = "remark" + index + "_" + typeId; } </table>
把这个代码看成一个页面。 当每个文本框都有不同的ID了,可是唯一的区别就是加了一个变量名而已。你的问题就迎刃而解。 后台取值方法。 (假设有30条数据,你可以在js里面保存一共有多少条数据) for (int i = 0; i < 30; i++) { string Pfirst = "Pfirst" + (i + 1).ToString(); string bili = "bili" + (i + 1).ToString(); string fufeie = "Pfirst" + (i + 1).ToString(); string shijian = "bili" + (i + 1).ToString(); if (!string.IsNullOrEmpty(Request[Pfirst])) { DrawProjectPlanInfo fileinfo = new DrawProjectPlanInfo(); fileinfo.DrawUpContractId = id; fileinfo.Pfirst = Request[Pfirst]; fileinfo.bili = Request[bili]; fileinfo.fufeie = Request[fufeie]; fileinfo.shijian = Request[shijian]; fileinfo.DrawUpContractId = model.DrawUpContractId; DrawProjectPlanManager.Add(fileinfo); } }
淡淡的活着 2014-06-26
  • 打赏
  • 举报
回复
嗯 一楼那样 只能传一串ID过后台 然后后台分开循环 ··不过这个和MVC4没什么关系吧 基本都是这样的
moonwrite 2014-06-26
  • 打赏
  • 举报
回复
能提交给Controller的只有form中的input url Cookies 所以你可以考虑怎么在input中下功夫~ 比如可以 <input name="listID" value="ID1;ID2;ID3"> FormCollection["listID"].split(';') ..... .... ....
MR00009 2014-06-26
  • 打赏
  • 举报
回复
直接提交表单,只能映射一条数据,因为每条数据的字段name或id都一样。
我现在在路上 2014-06-26
  • 打赏
  • 举报
回复
引用 5 楼 lizeyuan8238386 的回复:
直接提交表单就可以了,会自动映射的
有的时候会有的时候就不会,不知道为什么、、、以前碰到过
  • 打赏
  • 举报
回复
直接提交表单就可以了,会自动映射的
insus 2014-06-26
  • 打赏
  • 举报
回复
threenewbee 2014-06-26
  • 打赏
  • 举报
回复
一样的,每个TextBox给不同的id,然后循环遍历FormCollection

62,241

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部