在Partial View中,有一个使用Html.Helper类(TextBoxFor,DropDownListFor等)的表单(@addName)。
@model Models.ADP
using (@Html.BeginForm(new { id= @addName}))
{
@Html.TextBoxFor(model => model.EndValue, new { id = @newName, size = "5", style = "margin-right: 10px" })
@Html.HiddenFor(model => model.ModuleTypeId, new { @Value = @ViewBag.ModuleId }
@Html.DropDownListFor(model => model.DPId, @dpList, "Choose an Option...", new { @class = "select" })
}
我拦截提交以便异步发布和检索新数据,divId是整个部分视图的div。
$('#@saveName').click( function (event) {
event.preventDefault();
$.ajax({
url: '@Url.Action("SaveADP", "Dispense")',
type: 'POST',
data: $('#@addName').serialize(),
success: function (data) {
$('#@divId').html(data);
}
})
})
正在调用SaveADP操作,但是唯一具有设置值的字段是EndValue,其他字段(ModuleTypeId和DPId)具有默认值而不是其表单值。我在这里做错了什么?
答案 0 :(得分:7)
ASP.NET MVC不可知的方法是为每个元素提供id,然后将其作为JSON传递给控制器。作为它的一部分,它将更适合您的需要,因为响应可以在ajax请求的回调上获取。
实施例
var DTO = {
newDP: {
StartValue: $("#id_of_elm").val(),
EndValue: $("#newName").val(),
Duration: $("#id_of_elm").val(),
ModuleTypeId: $("#id_of_elm").val(),
DPId: $("#id_of_elm").val()
}
};
$('#saveName').click(function (event) {
event.preventDefault();
$.ajax({
contentType: 'application/json'
data: JSON.stringify(DTO),
type: 'POST',
url: '@Url.Action("SaveADP", "Dispense")'
}).done(function (data) {
$('#divId').html(data);
});
});
无关但重要的一点
#saveName
代替#@saveName
和#divId
代替#@divId
jqXHR.done()
是$.ajax
答案 1 :(得分:3)
首先,.serialize()
排除隐藏字段。
第二次,您应该检查下拉列表的HTML是否符合"successful controls"的以下规则。
注意:只有“successful controls”序列化为字符串。没有 由于表单未提交,因此提交按钮值已序列化 使用按钮。对于要包含在表单元素中的值 序列化字符串,该元素必须具有name属性。价值来自 复选框和单选按钮(“radio”或“checkbox”类型的输入) 仅在检查时才包括在内。来自文件选择元素的数据 没有序列化。
成功控制:
成功的控制对于提交是“有效的”。每一次成功 control的控制名称与其当前值配对 提交的表单数据集。必须定义成功的控制 在FORM元素中,必须具有控件名称。
然而:
- 禁用的控件无法成功。
- 如果表单包含多个提交按钮,则只有激活的提交按钮成功。
- 所有“打开”复选框都可能成功。
- 对于共享name属性相同值的单选按钮,只有“on”单选按钮可能会成功。
- 对于菜单,控件名称由SELECT元素提供,值由OPTION元素提供。只有选定的选项可能 成功的。如果未选择任何选项,则控件不会 成功,名称和任何值都没有提交给 表单提交时的服务器。
- 文件选择的当前值是一个或多个文件名的列表。提交表格后,每个文件的内容都是 与其余表格数据一起提交。文件内容是 根据表单的内容类型打包。
- 对象控件的当前值由对象的实现决定。
醇>
答案 2 :(得分:0)
下面是固定代码。我没有尝试过,但应该工作:
@model Models.ADP
@using (Html.BeginForm(new { id= addName}))
{
Html.TextBoxFor(model => model.EndValue, new {id = newName, size = "5", style = "margin-right: 10px"});
Html.HiddenFor(model => model.ModuleTypeId, new {@@Value = ViewBag.ModuleId});
Html.DropDownListFor(model => model.DPId, dpList, "Choose an Option...", new {@@class = "select"});
}