当数组动态附加到 DOM 元素时,IE 8 无法发布到 mvc 3
本文关键字:mvc IE 动态 数组 DOM 元素 | 更新日期: 2023-09-27 18:35:52
当使用 JQuery 动态创建复选框数组并附加到 DOM 元素时,IE 8 不会将复选框数组作为表单的一部分提交。 它与Firefox和Chrome完美配合。 我在服务器端使用 MVC 3 框架。 有什么变通办法可以与IE 8一起使用吗? 我肯定会感谢任何建议。
型:
public int[] SelectedTemplateRequirements { get; set; }
视图:
.HTML:
<label for="requirementsTemplateDetail">Requirements:</label><br />
<div id="requirementsTemplateDetail"></div>
JQUERY:
<script type="text/javascript">
/* Fills up the textarea */
function fillTextArea(ctrlName, list) {
// clear div
$('#requirementsTemplateDetail').empty();
$.each( list, function (index, itemData) {
// alert(itemData.Id );
$(ctrlName).append(
$(document.createElement('input')).attr({
name: 'SelectedTemplateRequirements',
value: itemData.Id,
type: 'checkbox',
checked: 'checked'
})
).append(itemData.Name + '<br/><br/>');
})
}
function fillRequirementsDropdown(response) {
fillTextArea("#requirementsTemplateDetail", response.Reqs);
}
function postFormRequirementsByTemplateID(ctrlName) {
var theForm = $(ctrlName).parents('form');
$.ajax({
type: "POST",
url: '@Url.Action("GetRequirementsByTemplateID")',
data: theForm.serialize(),
error: function (xhr, status, err) {
alert("An error occurred while saving'n'n" + err);
},
success: function (response) {
fillRequirementsDropdown(response);
}
});
return false;
}
function auditType_SelectionChanged() {
postFormRequirementsByTemplateID("#AuditTemplateId");
}
$(document).ready(function () {
$("#ClassTypeId").change(function () {
ClassType_SelectionChanged();
});
$("#AuditTemplateId").change(function () {
auditType_SelectionChanged();
});
$('#templateSearchID').click(function () {
auditTemplateButtonPressed();
});
$('#templateAllID').click(function () {
auditTemplateAllPressed();
});
});
</script>
控制器:
public class AuditController : ComplianceController
{
[HttpPost]
public ActionResult Create(string submit, AuditDocument document )
{
// Inserts into AuditRequirementDetail table
m_activeContract.insertAuditTemplateRequirements(document, myuser);
}
}
发生的情况是 IE 8 无法捆绑SelectedTemplateRequirements
数组,因为它在返回到控制器上的 post action 方法时显示为NULL
。 非常感谢对此的任何建议,因为IE 8仍然拥有庞大的用户群。
我认为
问题可能在于您创建复选框并将其附加到 DOM 元素的方式。
例如,假设您有以下代码:
// Append an input element built from a single string
for (var i = 0; i < 10; i++) {
$('<input type="checkbox" name="test" value="' + i + '" checked="checked" />').appendTo('#form1');
}
// Append an input element build using DOM and jQuery attribute manipulation
for (var i = 0; i < 10; i++) {
$(document.createElement('input')).attr({
name: 'test',
value: i,
type: 'checkbox',
checked: 'checked'
}).appendTo('#form2');
}
alert($('#form1').serialize());
alert($('#form2').serialize());
如果您检查Chrome或Firefox中的alert()
结果,您将从#form1
获得以下内容:
test=0&test=1&test=2&test=3&test=4&test=5&test=6&test=7&test=8&test=9
这来自#form2
:
test=0&test=1&test=2&test=3&test=4&test=5&test=6&test=7&test=8&test=9
它们是相同的,并支持您在Chrome和Firefox中具有预期行为的结果。但是,IE 的行为并不相同。IE8 和 IE9 中的相同代码从 #form1
生成以下内容:
test=0&test=1&test=2&test=3&test=4&test=5&test=6&test=7&test=8&test=9
而这来自#form2
:
test=on&test=on&test=on&test=on&test=on&test=on&test=on&test=on&test=on&test=on
通过对您的代码的简要检查,我会质疑您用于动态创建和附加复选框到 DOM 元素的方法。我不知道 MVC 如何处理每个 POST 变量都相同的情况,但它可能是您问题的一部分。
附加复选框的另一种跨浏览器方式:
for (var i = 0; i < 10; i++) {
$('<input type="checkbox" />').attr({
name: 'test',
value: i
}).prop('checked', true).appendTo('#form3');
}
在添加属性之前,需要确保指定了类型。此外,正确设置"checked"属性对于jQuery序列化IE中复选框的值(而不是状态)至关重要。
上面的JSFiddle。