asp.net浏览器向服务器提交json格式的数据

原型界面如下

asp.net浏览器向服务器提交json格式的数据

具体功能

        1、下拉框:动态绑定数据库数据;

        2、“+”按钮:单击时,在该条项目的直接下方添加一条新的奖惩条目;

        3、“-”按钮:只有一条奖惩条目时,清空输入框内容,否则,删除该奖惩条目;

        4、取消按钮:单击刷新页面

        5、保存按钮:单击时,验证用户输入信息的正确性,将用户输入信息转换为json格式的数据,把json格式的数据异步提交给服务器


具体实现

页面元素内容(body内容)

代码

<div class="main">
        <div style="font-size:20px;font-weight:bold;">
            市直单位名称:
            <input id="cc1" class="easyui-combobox" style="font-size:20px" editable="false" data-options="
                panelHeight: ‘auto‘,
                valueField: ‘市直单位ID‘,
                textField: ‘市直单位名称‘,
                url: ‘AddInput.ashx?commander=City‘"
            />
        </div>

        <%--外层div--%>
        <div id="F" class="easyui-panel" style="height: 300px; width: 600px;"> 
            <%--内层div--%>
            <div id="S0" style="font-size:15px;"> 
                奖惩项目名称:
                <input id="txtAddName0" name="txtName" type="text" value="编辑" style="width: 150px" onclick="IfFull(this);"/>
                分数:
                <input id="txtAddCount0" name="txtCount" type="text" value="编辑" style="width: 150px" onclick="IfFull(this);"/>
                <input id="cmdAdd0" name="Add" type="button" value="+" style="width: 40px" onclick="AddRow(this.id);" />
                <input id="cmdDel0" name="Del" type="button" value="-" style="width: 40px;" onclick="DelRow(this.id);" />
            </div>
        </div>

        <div>
            <input type="button" value="保存" onclick="SaveAdd();" />
            <input type="button" value="取消" onclick="ReLoad();" />
        </div>
    </div>

        页面元素由3大块内容组成,具体看原型图,其中最为关键的内容就是第二部分,实现动态增加元素的功能,利用节点的克隆来实现。


“+”按钮功能的实现

代码

//添加新的奖惩项目
        function AddRow(id) {
            //获得内层div元素节点
            var sElementNode = document.getElementById(id).parentNode;

            //克隆一套新的标签元素(内层div):奖惩名称和分数
            var clonedElementNode = sElementNode.cloneNode(true);

            //设置克隆的属性(id和value)   没有对克隆的属性进行设置也没有什么影响
            //1、获得新一套标签元素的统一标号
            var newId = parseInt($("input[value = ‘+‘]").length);
            //2、设置div的id
            clonedElementNode.id = "S" + newId;
            //3、设置div内部元素的属性
            clonedElementNode.childNodes.item(1).id = "txtAddName" + newId;
            $(clonedElementNode.childNodes.item(1)).val("编辑");
            clonedElementNode.childNodes.item(3).id = "txtAddCount" + newId;
            $(clonedElementNode.childNodes.item(3)).val("编辑");
            clonedElementNode.childNodes.item(5).id = "cmdAdd" + newId;
            $(clonedElementNode.childNodes.item(5)).val("+");
            clonedElementNode.childNodes.item(7).id = "cmdDel" + newId;
            $(clonedElementNode.childNodes.item(7)).val("-");

            //将克隆元素添加到外层Div中
            //1、外层div元素节点
            var fElementNode = sElementNode.parentNode;
            //2、添加
            if (fElementNode.lastChild == sElementNode) {
                //当前节点为最后一个元素节点
                fElementNode.appendChild(clonedNode);
            } else {
                //当前节点不是最后一个元素节点
                fElementNode.insertBefore(clonedElementNode, sElementNode.nextSibling);
            } 
        }

       对于克隆出来的元素的属性,可以重新定义,也可以不用,因为后面都是通过元素的class属性进行操作的。


“-”按钮功能的实现

代码

//删除选中的奖惩项目
        function DelRow(id) {
            //1、获取当前节点的内层div  
            var sElementNode = document.getElementById(id).parentNode;
            //2、获取当前节点的外层div
            var fElementNode = sElementNode.parentNode;
            //3、删除内层div
            if (fElementNode.childNodes.length > 3) {
                //a、元素节点大于2
                fElementNode.removeChild(sElementNode);
            } else {
                //b、只有一个元素节点
                $(sElementNode.childNodes.item(1)).val("");
                $(sElementNode.childNodes.item(3)).val("");
                $(sElementNode.childNodes.item(5)).val("+");
                $(sElementNode.childNodes.item(7)).val("-");
            }
        }

       这里对于是否只有一条奖惩条目的判断,用的是孩子节点,因孩子节点包括了所有的节点类型(文本节点,元素节点,注释节点),所以,在代码中会看到3(注释为注释节点,注释的两边有相应的空格,分别为一个文本节点)


取消按钮功能的实现

代码

//取消按钮,重新加载页面
        function ReLoad() {
            window.location.href = "CityAddInput.aspx";
        }

保存按钮功能的实现

代码

//保存奖惩项目
        function SaveAdd() {
            //有效性验证
            if ($(‘#cc1‘).combobox(‘getText‘) == "") {
                alert("请选择市直单位名称!");
                return;
            }

            //获得奖惩项目的个数
            var txtNameCount = parseInt($("input[name=‘txtName‘]").length);
            //获得所有奖惩项目名称节点
            var txtAllName = document.getElementsByName("txtName");
            //获得所有奖惩项目分数节点
            var txtAllCount = document.getElementsByName("txtCount");

            //有效性输入的判断
            for (var i = 0; i < txtNameCount; i++){
                //奖惩项目名称不能为空
                if (txtAllName[i].value == "" || txtAllName[i].value=="编辑") {
                    alert("请编辑奖惩项目名称");
                    txtAllName[i].focus();
                    return;
                }
                //奖惩项目名称中不存在相同命名
                for (var j = i+1; j < txtNameCount; j++) {
                    if(txtAllName[i].value == txtAllName[j].value){
                        alert("奖惩项目名称不允许出现重复");
                        txtAllName[j].focus();
                        return;
                    }
                }

                //奖惩项目分数不能为空
                if (txtAllCount[i].value == "" || txtAllCount[i].value == "编辑") {
                    alert("请编辑奖惩项目分数");
                    txtAllCount[i].focus();
                    return;
                }
                //奖惩项目分数必须为数字
                if (!(IsNum(txtAllCount[i].value))) {
                    alert("请输入数字!");
                    txtAllCount[i].focus();
                    return;
                }
            }

            //定义对象,集中要传送的数据
            var objData = new Object();
            //获得市直单位id
            objData.id = $(‘#cc1‘).combobox(‘getValue‘);

            var array = new Array();
            //获得相应的奖惩项目名称和奖惩项目分数
            for (var i = 0; i < txtNameCount; i++) {
                var obj = new Object();
                obj.name = txtAllName[i].value;
                obj.count = txtAllCount[i].value;
                array.push(obj);
            }

            //集合每条奖惩项目
            objData.array = array;

            //解析字符串
            var strData = JSON.stringify(objData);

            //传送数据
            $.post("InsertAddInput.ashx", { type: "市直单位", strJson: strData }, function (data) {
                if(data == "true") {
                    alert("添加成功!");
                    //重新加载页面
                    window.location.reload();
                }else if(data=="false") {
                    alert("指标已存在,请核对信息重新添加!");
                } else {
                    alert("未知错误存在,导致添加失败!");
                }
            });
        }

        //数字的验证,正数,负数,小数,正数;true表示为数字,false表示不为数字
        function IsNum(num) {
            var reg = /^\-?([1-9]\d*|0)(\.[1-9]{1,3})?$/;
            return reg.test(num);
        }

       JSON.stringify(object)可以把一个对象转换为json数据格式的字符串


文本框获得焦点的相应代码

//点击编辑的时候如果内容为编辑的话那就把value值清空,如果不是的话证明人家已经编写了就不清空了
        function IfFull(txtElementNode) {
            if (txtElementNode.value == "编辑") {
                txtElementNode.value = "";
            }
        }


总结

       一个大的功能,分割成多个小的功能,然后确定一个实现的流程

asp.net浏览器向服务器提交json格式的数据

上一篇:EF Core中通过Fluent API完成对表的配置


下一篇:基于MapGuide的在线WebGIS站点介绍