【开发心得】name标记引起的表单序列化元素丢失

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-22 15:19   17   0

今天在做一个前端界面的时候,发生一个诡异的问题:有一个下拉框元素,在做表单序列化的时候,HttpContext.Request.Form.AllKeys中竟然没有这个元素!而同一个界面的另外一个元素却可以序列化!好在总算解决了,过程简单描述如下,给碰到类似问题的朋友提个醒吧。

现象描述

两个元素的界面代码如下:

                        <div class="form-group">
                            <label class="myControlLabel col-md-3" for="ddlCustomer"><span class="required">*</span>&nbsp; 元素A:</label>
                            <div class="myControls col-md-9">
                                <select id="ddlCustomer" class="formSelect">
                                </select>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="myControlLabel col-md-3" for="ddlFileType"><span class="required">*</span>&nbsp; 元素B:</label>
                            <div class="myControls col-md-9">
                                <select id="ddlFileType" class="formSelect">
                                    <option value="" selected="selected">请选择</option>
                                    <option value="A">A类</option>
                                    <option value="B">B类</option>
                                    <option value="C">C类</option>
                                    <option value="D">D类</option>
                                </select>
                            </div>
                        </div>

看上去唯一的区别在于:元素A是通过jquery到后台取数据以后填充的,元素B是固定值的下拉框。网上有文章解释下拉框里默认是空值的话,有可能是取不到值,经过验证测试,不是这个原因。

问题解决

折腾半个小时,突然发现,其他一些文本框元素都是有name属性的,会不会下拉框元素也是用name序列化的?马上修改代码如下:

                        <div class="form-group">
                            <label class="myControlLabel col-md-3" for="ddlFileType"><span class="required">*</span>&nbsp; 档案类别:</label>
                            <div class="myControls col-md-9">
                                <select id="ddlFileType" name="ddlFileType" class="formSelect">
                                    <option value="" selected="selected">请选择</option>
                                    <option value="A">A类</option>
                                    <option value="B">B类</option>
                                    <option value="C">C类</option>
                                    <option value="D">D类</option>
                                </select>
                            </div>
                        </div>

经过测试,问题解决!

原因分析

这是一个明显偷懒造成的结果,其实在写元素的时候,每个元素都应该写上id和name。为什么元素A不用写呢?

经过分析js代码,发现了这句:

    var divSelectHtml = '<div name="' + taget + '" class="mySelector"><input name="' + taget + '"  type="hidden" value="" id="selector_' + taget + '" />' + aBtn + '\
                        <div class="mySelector_panel"><div class="mySelector_search"><input type="text" autocomplete="off"></div>' + selectorResultHtml + '</div></div>';
    $this.hide();
    $('#' + taget).next('[class="mySelector"]').remove();
    $('#' + taget).after(divSelectHtml);
    $('#selector_' + taget).val(selectedValue);

原来,由于此元素被js重写了,也加上了name属性,因此就可以被序列化了!

由于之前都是拷贝之前的代码,运气比较好,都是带name的,所以没有发现问题,这次偶尔自己写了一下,立马出问题,还是基础不牢,地动山摇啊。

写下此篇文章,引以为戒。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP