用户需求是:一个表单一旦创建完,其中大部分的字段便不可再编辑。只能编辑其中部分字段。
而不可编辑是通过对input输入框设置disabled属性实现的,那么这时候直接向数据库中submit表单中的内容就会报错,因为有些不能为null的字段由于disabled属性根本无法在前端被获取而后更新至数据库。
有下面两种思路:
1.通过创建隐藏表单,为每一个disabled控件分别创建一个隐藏控件,但是这样的问题是工作量太大(如果表单有一千个属性,你懂的)
2.通过获取该表单在数据库中的id,把该id和可以编辑的字段传递到后台。首先通过id将对象及其属性数据从数据库中搜索出来,然后将可以编辑的字段赋值给该对象。处理完毕后,再将该对象的数据更新至数据库。
综上所述,用第二种思路能显得更加睿智。
下面是具体的操作步骤:(具体步骤就不用细看了,这是我从项目中抽出来的,只适合我自己回顾)
1.在OutsourcingModule.cs中创建路由,以此创建一个访问路径:
routes.MapRoute( "OutSourcingWorkSheet",//路由名 "outsourcing/saveWorkSheet",//url路径 new {controller = "Outsourcing", action = "SaveWorkSheet"}//映射的控制器以及对应的Action方法名 );
2.
/// <summary> /// 保存工作票 /// ModelBinder会将前端传递过来的id在数据库中搜索出字段并且转换为outsourcing对象 /// 此时的outsourcing对象中的workSheets属性不是前端传递过来的值,而是数据库中的 /// /// 方法中有两个参数,outsourcing上面已经解释,workSheets是前端传递过来的第二个参数 /// </summary> /// <param name="outsourcing"></param> /// <param name="workSheets"></param> /// <returns></returns> [HttpPost] [ActionName("SaveWorkSheet")] [AccessRestriction("SaveWorkSheet")] public JsonResult SaveWorkSheet(Outsourcing outsourcing,string workSheets) { if (outsourcing!=null) { outsourcing.WorkSheets = workSheets; _outsourcingService.Save(outsourcing); return Json(new ABResponse(HttpStatusCode.OK)); } return Json(new ABResponse(HttpStatusCode.BadRequest)); }//AB为内部项目
3.前端js脚本代码
$('#btn_saveWorkSheet').on('click', function () { if ($("input[name=workSheets]").val() == "") { bootbox.alert("不能为空"); } else { $.ajax({ type: "post", url: "/outsourcing/saveWorkSheet", data: { ID: $("#outsourcing_id").val(), WorkSheets: $("input[name=workSheets]").val() }, dataType: "json", success: function (data) { if (data.Code == 200) { bootbox.alert("修改成功,即将刷新"); setTimeout(function () { location.reload(); }, 1000); } else { bootbox.alert("提交失败,请稍后再试"); } } }); } });
其实思路很简单,但是我特么做了大半天- -;其中还遇到了一个大坑:
在第二段代码的参数列表中,我一开始把string workSheets写成了WorkSheets。这时文字下出现了蓝色的波浪线,Alt+Enter后系统提示Rename to workSheets,我便直接回车确定了。然后,WorkSheets字段便再也无法保存,也不能从数据库中读取。在同事帮忙找了N久之后发现,原来是当时大写改小写的过程中同时将dbml文件中的字段也改成了小写导致了无法和数据库匹配。
做这个功能的时候顺便学到的一点知识:
如果一个input的id为apple,那么可以这么获取,这是我本来就知道的:
var apple = $("#apple").val();
如果一个input的name为apple,那么可以这么获取,这是我刚知道的:
var apple = $("input[name=apple]").val();
还有一个刚知道的,如果从很多input中去除某个name:
$("#fruit").find("input:not(input[name=apple]),textarea,select").attr("disabled", true); //从id为fruit的父元素里面寻找所有的input、textarea和select控件以及其值,但是除去name为apple的控件
另外总结下ajax的方式,很久不用都快忘了:
$.ajax({ type:"post",//可以选择post或者method url:"",//url接口 data:{ //参数列表 }, success:function(data){ //如果访问url成功,data就是该url接口自动返回的数据 } })
总结
以上所述是小编给大家介绍的Asp.Net MVC4通过id更新表单内容的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。