ITOO---MVC3.0动态添加表格的行数并Controller中获取添加数据

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="#" onclick="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 onclick="addNewRow();" plain="true" iconcls="icon-add" class="easyui-linkbutton" href="#" id="add"></a>
                            <a onclick="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'" onclick="submitInfo();" align="center">确认</a>
                <a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'" style="margin-left: 50px" onclick="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='#' onclick='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><aonclick='addNewRow();' plain='true' iconcls='icon-add'class='easyui-linkbutton' href='#' id='add'>加</a>" +
                              "<aonclick='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);
        }

 

         本分的思路想必读完文章之后大家也能有所了解,我将这个问题分解成了四部分,每一部分既独立又相互联系,最后达到了自己想要的结果。

         我想,无论考虑什么问题我们都应该像这篇文章一样将问题分解,然后一个一个的小问题去解决,最终达到解决整个问题的目标。首先从简单的入手,从自己已有的积累出发。

上一篇:.NET数据库编程求索之路--3.使用ADO.NET实现(SQL语句篇)(1)


下一篇:《PostgreSQL服务器编程》一一2.6 过程化语言