1

在部分视图中,有一个使用 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)具有默认值而不是它们的表单值。我在这里做错了什么?

4

3 回答 3

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);
    });
});

无关但重要的点

  1. 请使用#saveName代替#@saveName#divId代替#@divId
  2. 请注意,这jqXHR.done()是处理成功回调的新方法$.ajax
于 2013-11-05T23:36:45.637 回答
3

首先.serialize()排除隐藏字段。

其次,您应该检查下拉列表的 HTML 是否符合以下“成功控件”规则。

API 文档中引用了一段话:

注意:只有“成功的控件”被序列化为字符串。由于未使用按钮提交表单,因此没有序列化提交按钮值。对于要包含在序列化字符串中的表单元素的值,该元素必须具有 name 属性。来自复选框和单选按钮(“单选”或“复选框”类型的输入)的值仅在它们被选中时才被包括在内。来自文件选择元素的数据未序列化。

成功控制

一个成功的控件对于提交是“有效的”。每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分。成功的控件必须在 FORM 元素中定义,并且必须具有控件名称。

然而:

  1. 禁用的控件不能成功。
  2. 如果一个表单包含多个提交按钮,只有激活的提交按钮是成功的。
  3. 所有“打开”复选框都可能成功。
  4. 对于共享相同 name 属性值的单选按钮,只有“on”单选按钮可能成功。
  5. 对于菜单,控件名称由 SELECT 元素提供,值由 OPTION 元素提供。只有选定的选项可能会成功。如果未选择任何选项,则控件不成功,并且在提交表单时,名称和任何值都不会提交给服务器。
  6. 文件选择的当前值是一个或多个文件名的列表。提交表单后,每个文件的内容都会与表单数据的其余部分一起提交。文件内容根据表单的内容类型打包。
  7. 对象控件的当前值由对象的实现决定。
于 2013-11-05T23:02:18.403 回答
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"});
}
于 2013-11-05T23:03:49.320 回答