多表连接的数据新增
开发工具与关键技术:VisualStudio MVC
作者:老龙
撰写时间:2019/4/18
下面就以新增学生数据为例介绍多表连接的新增。比如在一个已经查询好的表格里新增一条学生信息,里面包括学生的班级、姓名、性别、身份证号、学生个人照片等诸如此类的信息。
一、 控制器方法总结:
public ActionResult InsertExaminee(FormCollection form, HttpPostedFileBase file)
{ 控制器方法
ReturnJson msg = new ReturnJson();
int AcademeID = Convert.ToInt32(form["AcademeID"]);
int SpecialtyID = Convert.ToInt32(form["SpecialtyID"]);
int GradeID = Convert.ToInt32(form["GradeID"]);
int ClassID = Convert.ToInt32(form["ClassID"]);
string StudentName = form["StudentName"].Trim();
string StudentSex = form["StudentSex"].Trim();
string StudentIDNum = form["StudentIDNum"].Trim();
string StudentNumber = form["StudentNumber"].Trim();
string UniformAuthenticationCode = form["UniformAuthenticationCode"].Trim();
try
{
//判断学号 和 身份证是否已经存在
int hasStudent = (from tbStudent in myModel.PW_Student
where tbStudent.StudentNumber == StudentNumber
|| tbStudent.StudentIDNum == StudentIDNum
select tbStudent).Count();
if (hasStudent == 0) //可以进行新增操作
{
#region 新增用户
Models.PW_User modUser = new Models.PW_User();//用户
modUser.UserNuber = StudentNumber;//用户编号
modUser.Password = Common.AESEncryptHelper.Encrypt(UniformAuthenticationCode);
modUser.UniformAuthenticationCode = UniformAuthenticationCode;//统一认证码
modUser.ToVoidNo = true;//是否作废 不作废
myModel.PW_User.Add(modUser);
myModel.SaveChanges();
#endregion
#region 新增学生
var InUserID = modUser.UserID;//获取新增用户的ID
Models.PW_Student modStudent = new Models.PW_Student();
if (InUserID != 0)
{
if (file != null)
{
byte[] newFile = new byte[file.ContentLength];
file.InputStream.Read(newFile, 0, file.ContentLength);
modStudent.StudentPicture = newFile;
}
modStudent.UserID = InUserID;//用户ID
modStudent.ClassID = ClassID;//班级ID
modStudent.GradeID = GradeID;//年级ID
modStudent.SpecialtyID = SpecialtyID;//专业ID
modStudent.AcademeID = AcademeID;//学院ID
modStudent.StudentName = StudentName;//学生姓名
modStudent.StudentSex = StudentSex;//学生性别
modStudent.StudentIDNum = StudentIDNum;//身份证号
modStudent.StudentNumber = StudentNumber;//学号
myModel.PW_Student.Add(modStudent);//
myModel.SaveChanges();
//新增用户明细
Models.PW_UserRoleDetail modUserRoleDetail = new Models.PW_UserRoleDetail();
var UserTypeID = (from tbUserType in myModel.SYS_UserType
where tbUserType.UserType == "学生"
select new
{
tbUserType.UserTypeID//用户类型ID
}).ToList();
modUserRoleDetail.UserID = InUserID;//用户ID
modUserRoleDetail.UserTypeID = Convert.ToInt32(UserTypeID[0].UserTypeID);
myModel.PW_UserRoleDetail.Add(modUserRoleDetail);
myModel.SaveChanges();
msg.State = true;
msg.Text = "该学生的数据新增成功!";
}
#endregion
}
else {//有学生存在
msg.Text = "该数据已经存在,不能新增!";
}
}
catch (Exception)
{
msg.Text = "数据异常请检查数据!";
}
return Json(msg,JsonRequestBehavior.AllowGet);
}
页面方法
function saveStuInfor() {
var AcademeID = $("#modAcademe").val();
var SpecialtyID = $("#modSpecialty").val();
var GradeID = $("#modGrade").val();
var ClassID = $("#modClass").val();
var StudentName = $("input[name='StudentName']").val();
var StudentSex = $("input[name='StudentSex']").val();
var StudentIDNum = $("input[name='StudentIDNum']").val();
var StudentNumber = $("input[name='StudentNumber']").val();
var UniformAuthenticationCode = $("input[name='UniformAuthenticationCode']").val().trim();
var file = $("#fileImage").get(0).files[0];//获取学生头像img
var StuPicture = $("#StuPicture").attr("src");
if (StuPicture=="") {
layer.alert("请选择图片文件", { icon: 1 });
return false;
}
if (AcademeID != 0 && SpecialtyID != 0 && GradeID != 0 && ClassID != 0 && StudentName != "" &&
StudentSex != 0 && StudentIDNum != "" && StudentNumber != "" && UniformAuthenticationCode != "") {
if (blInsert) { //新增考生信息数据操作
//直接用fd=new FormData(document.getElementById('id'));这种方式可以省去append()方法挨个添加
var formData = new FormData(document.getElementById("frmStuInfor"));
var xhr;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xhr = new XMLHttpRequest();
} else {
// code for IE6, IE5
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("POST", "InsertExaminee");
xhr.send(formData);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var txt = xhr.responseText;//返回一个json对象
var jsObj = JSON.parse(txt);///json对象转换为js对象
if (jsObj.State) {//jsObj.State判断数据是否修改成功
$("#modStudent").modal("hide");//关闭模态窗体
layer.alert(jsObj.Text, { icon: 1, offset: '150px', skin: 'layui-layer-molv', closeBtn: 0 });//弹出提示框
//tabAcademe = layuiTable.reload('tabAcademe');//表格刷新
tabStudentSearch();
} else {
layer.alert(jsObj.Text, { icon: 5, offset: '150px' });//弹出提示框
}
}
}
}
}
-
实例化实体类,用来记录新增数据的成功或者失败的状态信息。
-
传输参数。在控制器里声明两个参数form和file,一个用来接收页面方法提交的from表单,一个接收图片文件。
-
查询重复。身份证号与学号是唯一的,所以可以查询身份证号是否已经存在,若是已经存在则不执行新增操作并返回提示。否则执行新增操作。
-
新建用户临时表保存新增用户的账号、密码、作废状态等信息,再将该表添加进用户表,记录数据的变化状态。
-
获取新增用户的ID,新建临时学生表接收学生个人信息。
-
判断学生头像的图片文件是否为空,若是不为空则建立一个数组接收图片,并重新读取图片获取文件的长度,生成一个新的图片文件。
-
将学生的姓名,性别,身份证号等个人信息存入临时的学生表,将临时学生表保存到学生数据总表,记录新增数据变化状态。
-
新建临时用户信息明细表,查询用户类型为学生的数据,将查询出来的用户ID赋值给之前新建的用户ID,临时用户信息明细表存入用户信息明细总表,记录新增数据变化状态。
二、页面方法保存新增:
1.获取form内输入的所有数据,选取的学生头像图片。判断form的所有输入框、下拉框等是否都有输入数据,还有学生的头像图片是否有选取,若是有任何一个数据为空时就提示数据输入不完整,不执行新增操作。
2. 用变量接收form表单的数据。直接用fd=new FormData(document.getElementById(‘id’)
的方式可以省去qppend()方法挨个添加。
3. 保存新增数据。接下来使用最原始的AJAX XHR方法进行数据的新增保存。
AJAX XHR方法:
-
XHR创建对象。为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject
-
XHR请求。如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法。Open(method,url,async)规定了请求的类型URL以及是否异步处理请求。其中method:请求的类型;GET 或 POST;url:在服务器的位置;async:true(异步)或 false(同步)。Send(sthing)将请求发送到服务器;shing:仅用于post请求
-
XHR响应。如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。如果来自服务器的响应并非 XML,则使用 responseText 属性,responseText 属性返回字符串形式的响应。如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:
-
XHR readyState。Onreadystatechange事件:存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。readyState:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。(0: 请求未初始化;1: 服务器连接已建立;2: 请求已接收;3: 请求处理中;4: 请求已完成,且响应已就绪)。Status(200: “OK”;404:未找到页面)