标签:
一、业务情景:
做的是一个项目管理的增删改查模块,一个项目里面有项目成员属性,而且一个项目可以有多个成员,一个成员可以参加多个项目,多对多关系,数据库表里自然要建立一个关系表。
视图
二、视图显示:
因为新增项目和修改项目的时候用的是同一个视图,所以项目成员多选框那里不仅要显示所有用户,而且要把在项目成立里的数据要选上显示,这里我先把所有用户从用户表里查出来,然后显示在页面上,然后再判断每个用户是否在用户成员表里面,在的话就给勾选上。
1 <tr> 2 <td class="field"> 3 <label> 4 项目成员:@*<span class="xing">*</span>*@ 5 6 </label> 7 </td> 8 <td class="otherfont"> 9 @{ 10 var users = ViewBag.users; 11 var projectmember = ViewBag.projectmember; 12 13 } 14 @foreach (var user in users) 15 { 16 17 bool result = true; 18 foreach (var test in projectmember) 19 { 20 if (test == user.UserId) 21 { 22 result = false; 23 } 24 else 25 { 26 continue; 27 28 } 29 } 30 if (result == true) 31 { 32 33 <input type="checkbox" name="selectusers" value=@user.UserId />@user.RealName 34 35 36 } 37 else 38 { 39 40 <input type="checkbox" name="selectusers" checked="True" value=@user.UserId />@user.RealName 41 42 } 43 44 } 45 </td> 46 47 </tr>
三、新增模块
新增的时候要把勾选得数据存入项目成员表,先获得所有勾选得数据,然后分离开来,获得每个用户的ID,再做个循环插入数据到数据库,这样就能把所有项目成员都插入到项目成员表了,由于可能存在多个用户,需要多次操作数据库,所以需要使用事物。
/// <summary> /// 新增项目时添加项目成员表 /// </summary> /// <param name="str">项目成员组成的字符串</param> /// <param name="proId">项目ID</param> /// <returns></returns> public bool AddUserInProject(string str, Guid proId) { bool result = true;//为了后面记录是否全部插入成功做准备 string sqlstr = "";//数据库操作字符串 // List<Guid> historyusers = GetProjectMember(proId);//得到已经存在的项目成员数组 string[] userids = str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); int usernum = userids.Length;//用来记录实际要插入的数据条数 for (int i = 0; i < userids.Length; i++) { Guid userid = new Guid(userids[i]);//需要增加的用户ID sqlstr = sqlstr + "insert into tb_UserInProject(ProjectId,UserId)values(‘" + proId + "‘,‘" + userid + "‘);"; } try { //string sql = @"insert into tb_UserInProject(ProjectId,UserId)values(@projectid,@userid);"; //需要操作多条数据库语句,使用事物 using (TransactionScope scope = new TransactionScope()) { using (var context = DataBaseConnection.GetSqlServerConnection()) { var affectrow = context.Execute(sqlstr); result = affectrow == usernum; } // 没有错误——提交事务 scope.Complete(); } } catch (Exception) { //throw; } return result; }
四、修改模块
由于当时准备把新增和修改的业务逻辑都写在一个方法里面,所以纠结了很久,因为新增的时候就已经很麻烦了,还要修改,修改的时候又想着哪些用户原来有,哪些需要增加进去,哪些需要去掉,所以让我纠结了很久。后来把新增业务逻辑和修改业务逻辑分别放在不同方法中后,就渐渐明了了,修改的时候,先直接删除掉原来的项目成员,然后把新的项目成员添加进去即可。当然,由于存在操作多个语句,所以都需要使用事物来操作,这样一旦哪个没成功,就可以自动回滚。
/// <summary> /// 修改项目成员 /// </summary> /// <param name="str">项目成员s</param> /// <param name="proId">项目ID</param> /// <returns></returns> public bool UpdateUserInProject(string str, Guid proId) { bool result = true;//为了后面记录是否全部插入成功做准备 string sqlstr = "";//数据库操作字符串 string sqldelstr = @"delete tb_UserInProject where ProjectId=‘"+proId+"‘"; List<Guid> historyusers = GetProjectMember(proId);//得到已经存在的项目成员数组 int historyusersnum = historyusers.Count;//获得历史成员的数目 string[] userids = str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); int usernum = userids.Length;//用来记录实际要插入的数据条数 for (int i = 0; i < userids.Length; i++) { Guid userid = new Guid(userids[i]);//需要增加的用户ID sqlstr = sqlstr + "insert into tb_UserInProject(ProjectId,UserId)values(‘" + proId + "‘,‘" + userid + "‘);"; } //需要操作多条数据库语句,使用事物 using (TransactionScope scope = new TransactionScope()) { using (var context = DataBaseConnection.GetSqlServerConnection()) { var affectrow1 = context.Execute(sqldelstr);//删除原来项目成员 var affectrow2 = context.Execute(sqlstr);//添加修改后的项目成员 result = (affectrow1 == usernum)&&(affectrow2==historyusersnum); } // 没有错误——提交事务 scope.Complete(); } return result; }
查询和删除在修改的时候有体现,点击修改的时候,会查询以前的项目成员,进行修改的时候,会先删除以前成员,然后添加新的成员数组!!
注:本人编程新手,肯定有很多纰漏,本文纯属个人笔记,欢迎大家批评指教,当然,如需转载,请标明出处! ----喜狗
标签:
原文地址:http://www.cnblogs.com/ygx-me/p/4911167.html