从ajax发布MVC Razor表单

时间:2013-11-05 22:29:27

标签: jquery ajax asp.net-mvc razor html-helper

在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)具有默认值而不是其表单值。我在这里做错了什么?

3 个答案:

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

无关但重要的一点

  1. 请使用#saveName代替#@saveName#divId代替#@divId
  2. 请注意jqXHR.done()$.ajax
  3. 处理成功回调的新方法

答案 1 :(得分:3)

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

第二次,您应该检查下拉列表的HTML是否符合"successful controls"的以下规则。

引用API Documentation

  

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

成功控制

  

成功的控制对于提交是“有效的”。每一次成功   control的控制名称与其当前值配对   提交的表单数据集。必须定义成功的控制   在FORM元素中,必须具有控件名称。

     

然而:

     
      
  1. 禁用的控件无法成功。
  2.   
  3. 如果表单包含多个提交按钮,则只有激活的提交按钮成功。
  4.   
  5. 所有“打开”复选框都可能成功。
  6.   
  7. 对于共享name属性相同值的单选按钮,只有“on”单选按钮可能会成功。
  8.   
  9. 对于菜单,控件名称由SELECT元素提供,值由OPTION元素提供。只有选定的选项可能   成功的。如果未选择任何选项,则控件不会   成功,名称和任何值都没有提交给   表单提交时的服务器。
  10.   
  11. 文件选择的当前值是一个或多个文件名的列表。提交表格后,每个文件的内容都是   与其余表格数据一起提交。文件内容是   根据表单的内容类型打包。
  12.   
  13. 对象控件的当前值由对象的实现决定。
  14.   

答案 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"});
}