MVC3.0动态添加表格的行数并Controller中获取添加数据
最近由于项目的中的相关需求,需要在MVC的视图中动态的添加添加数据的行数,并将前台输入的多行数据在Controller中获得传回服务端。本文将介绍如何从MVC的View端动态添加数据行数并将输入的数据在Controller中获得。
问题分析
一、设计前台显示页面(View)。
视图中样式
@*添加上课班信息窗口*@
<div id="Addwin" class="easyui-window" title="添加教学班信息" style="width: 815px; height: 400px"
data-options="iconCls:'icon-save',modal:true">
<div style="padding: 15px 15px 10px 60px;">
<form id="AddForm" method="post" style="width: 710px;height: 300px">
<table cellpadding="3" id="myTab">
@*<thead>*@
<tr align="center">
<td>教学班编号</td>
<td>教学班名称</td>
<td>课程名称</td>
<td>教师名</td>
<td>教工号</td>
<td>选择学生</td>
<td>人数</td>
<td style="border:0"></td>
</tr>
<tr>
<td>
<input type='text' style='width:80px' name="OnClassNo1" id="OnClassNo1" />
</td>
<td>
<input type='text' style='width:130px' name="OnClassName1" id="OnClassName1" />
</td>
<td>
<input type='text' style='width:100px' name="CourseName1" id="CourseName1" />
</td>
<td>
<input type='text' style='width:50px' name="TeacherName1" id="TeacherName1" />
</td>
<td>
<input type='text' style='width:80px' name="EmployeeNo1" id="EmployeeNo1" />
</td>
<td>
<a id="selectStu1" href="#" οnclick="addStudentWin();">选择学生</a>
</td>
<td>
<input type='text' style='width:40px' name="TotalMember1" id="TotalMember1" />
</td>
<td style="border:0">
<input style='width:40px; border:0' type='hidden' name="StudentArray1" id="StudentArray1" />
</td>
<td>
<div>
<a οnclick="addNewRow();" plain="true" iconcls="icon-add" class="easyui-linkbutton" href="#" id="add"></a>
<a οnclick="removeRow();" plain="true" iconcls="icon-remove" class="easyui-linkbutton" href="#" id="eidt"></a>
</div>
</td>
</tr>
</table>
@*position:fixed;bottom:15px;left:250px;*@
</form>
<div class="login" style="text-align: center;bottom:15px;margin-top: 5px " >
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" οnclick="submitInfo();" align="center">确认</a>
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" style="margin-left: 50px" οnclick="javascript:$('#Addwin').window('close');">取消</a>
</div>
</div>
</div>
二、如何动态的添加(删除)记录的行数。
在这里我尝试了两种方法,都能够实现动态的添加行数的作用下面是两种方法的JS文件内容。
方法一:
<pre name="code" class="javascript">var i = 1;
function addRow() {
//用于表格id的自增长
++i;
if (i<5) {
//克隆指定的行
var newTr =tr1.cloneNode(true);
//指定新行的id
newTr.id = "tr" + i;
//指定新行的name
newTr.name = "tr" + i;
//在当前表格中插入行
tr1.parentNode.insertAdjacentElement("beforeEnd", newTr);
} else {
alert("提示消息","最多添加四行!");
}
}
function delRow() {
var tab = document.getElementById('list');
if (tab.rows.length > 2) {
tab.deleteRow(tab.rows.length - 1);
}
else {
alert("已经剩下最后一行,不能删除!");
}
}
方法二:
//动态创建table
function addNewRow() {
var tabObj = document.getElementById("myTab");//获取添加数据的表格
var rowsNum = tabObj.rows.length; //获取当前行数
var colsNum = tabObj.rows[rowsNum - 1].cells.length;//获取行的列数
var myNewRow = tabObj.insertRow(rowsNum);//插入新行
if (rowsNum >= 9) {
alert("警告,最多添加八行记录!");
} else {
var newTdObj1 =myNewRow.insertCell(0);
newTdObj1.innerHTML = "<input type='text' style='width:80px'name='OnClassNo" +rowsNum + "'id='OnClassNo" +rowsNum + "'/>";
var newTdObj2 =myNewRow.insertCell(1);
newTdObj2.innerHTML = "<inputtype='text' style='width:130px' name='OnClassName" + rowsNum + "'id='OnClassName" +rowsNum + "'/>";
var newTdObj3 =myNewRow.insertCell(2);
newTdObj3.innerHTML = "<inputtype='text' style='width:100px' name='CourseName" + rowsNum + "' id='CourseName" + rowsNum + "' />";
var newTdObj4 =myNewRow.insertCell(3);
newTdObj4.innerHTML = "<input type='text' style='width:50px'name='TeacherName" + rowsNum + "' id='TeacherName" + rowsNum + "'/>";
var newTdObj5 = myNewRow.insertCell(4);
newTdObj5.innerHTML = "<inputtype='text' style='width:80px' name='EmployeeNo" + rowsNum + "'id='EmployeeNo" +rowsNum + "'/>";
var newTdObj6 =myNewRow.insertCell(5);
newTdObj6.innerHTML = "<inputtype='text' style='width:50px' name='selectStudent" + rowsNum + "'id='selectStudent" + rowsNum + "' value='选择学生'/>";
newTdObj6.innerHTML = "<aid='selectStu" +rowsNum + "'href='#' οnclick='addStudentWin();'>选择学生</a>";
var newTdObj7 =myNewRow.insertCell(6);
newTdObj7.innerHTML = "<inputtype='text' style='width:40px' name='TotalMember" + rowsNum + "'id='TotalMember" +rowsNum + "' />";
var newTdObj8 =myNewRow.insertCell(7);
newTdObj8.innerHTML = "<inputtype='hidden' style='width:40px; border:0' name='StudentArray" + rowsNum + "'id='StudentArray" + rowsNum + "' />";
var newTdObj9 =myNewRow.insertCell(8);
newTdObj9.innerHTML = "<div><aοnclick='addNewRow();' plain='true' iconcls='icon-add'class='easyui-linkbutton' href='#' id='add'>加</a>" +
"<aοnclick='removeRow();' plain='true' iconcls='icon-remove'class='easyui-linkbutton' href='#' id='eidt'>删</a></div>";
}
}
//窗口表格删除一行
function removeRow() {
var tab = document.getElementById('myTab');
var i = tab.rows.length;
if (tab.rows.length > 2) {
tab.deleteRow(tab.rows.length - 1);
--i;
}
else {
alert("已经剩下最后一行,不能删除!");
}
}
最终我选择了第二种方案,因为相对于第一种方案第二种方案中的数据更容易获得。第一种方案不同的是行号,每行中相同字段的数据不易区分;第二种方案每行相同字段的ID是不一样的易于数据的获得。
三、如何提交输入的数据
JS实现如下:
//提交表单
function submitInfo() {
//提交表单
$.messager.progress(); // 显示进度条
$('#AddForm').form('submit', {
url: "/OnClass/AddOnClassInfo",
onSubmit: function () {
},
success: function (data) {
if (data > 0) {
alert("保存成功");
}
$('#dg').datagrid('reload'); // 重新载入当前页面数据
//$.messager.progress('close'); // 如果提交成功则隐藏进度条
$('#Addwin').window('close'); //关闭窗口
}
});
}
四、在Controller中获得前台输入的数据
数据已经提交了如何去或者这些数据,就又是一个问题了,如何解决详见如下代码。
<pre name="code" class="csharp"> public void AddOnClassInfo(IList<OnClass> lstOnClass)
{
//1.获取行数
int rowNum = 0;
string strOnClassName = "";
bool flag = true;
do
{
rowNum++;
//stringstrTeachingName = "teachingClassName" + rowNum;
strOnClassName = Request["teachingClassName" + rowNum];
if (strOnClassName==null || strOnClassName=="")
{
flag = false;
}
} while (flag);
//2.循环每一行,给实体对象分别赋值
List<OnClass> lstOnClassInfo= new List<OnClass>();
for (int i = 1; i <rowNum; i++)
{
OnClass onClass = new OnClass()
{
OnClassID = Guid.NewGuid(),
OnClassName = Request["teachingClassName" + i],
// for (int j = 0; j< rowNum; j++)
//{
//}
};
lstOnClassInfo.Add(onClass);
}
//调用服务端服,跟本文主题无关
onClassService.AddOnClassBatch(objOnClass);
}
本分的思路想必读完文章之后大家也能有所了解,我将这个问题分解成了四部分,每一部分既独立又相互联系,最后达到了自己想要的结果。
我想,无论考虑什么问题我们都应该像这篇文章一样将问题分解,然后一个一个的小问题去解决,最终达到解决整个问题的目标。首先从简单的入手,从自己已有的积累出发。