Asp.net mvc反序列化ajax.beginForm

时间:2017-11-06 15:37:20

标签: json ajax asp.net-mvc-4

我需要传递我的模型,以这种形式构建:

using (Ajax.BeginForm("Index", null, new AjaxOptions() { UpdateTargetId = "FormContainer", HttpMethod = "Post", InsertionMode = InsertionMode.Replace, OnSuccess = "successFunc" }, new { id = "UpdateForm" }))

采用这种方法:

public ActionResult SavePreset(DocumentFilterModel model, string name)
{
    //Do some magic
    return PartialView("Partial/FilterListPartial", model);
}

关键是默认情况下,此表单将收集报表预设,但我需要添加和选项以在我的数据库中保存预设,这就是需要SavePreset方法的原因。

我试过使用这个脚本:

$("#SavePresetButton").on("click", function () {
$.ajax({
    type: "POST",
    url: '@Url.Action("SavePreset", "Reports")',
    data: {
        name: $("#PresetNameEditor").val(),
        model: $("#UpdateForm").serialize()
    }
    }).success(function(result) {
        $("#FilterSettingsContainer").html(result);
    });
});

但是我遇到了一个问题,我在null中得到DocumentFilterModel model(如果将model参数的类型更改为string)则无法反序列化它。我尝试过的事情:

var SettingsModel = new JavaScriptSerializer().Deserialize<DocumentFilterModel>(model);
var a =  JsonConvert.DeserializeObject<DocumentFilterModel>(model);

顺便说一句,(这些过滤器位于单独的局部视图中)我想保持我的表格不变,因为我仍然需要用记录列表更新我的第二个局部视图,DocumentFilterModel也是大手动解析它。

1 个答案:

答案 0 :(得分:1)

serialize方法读取您的表单并生成带有输入元素名称和值的url编码字符串。所以基本上它将是一个很大的问题。当您将其作为data调用的$.ajax属性传递时,jquery将使用该属性作为请求正文(如FormData)

所以当你尝试这样的事情时

data:{
        name: $("#PresetNameEditor").val(),
        model: $("#UpdateForm").serialize()
     }

尝试发送像这样的对象

{name: "Abc", model: "FirstName=Scott&Email=someEmail"}

您可以看到您有一个具有2个属性的js对象,第二个属性具有查询字符串格式的所有输入值。模型绑定器无法读取此数据并映射到您的DocumentFilterModel对象!。

您无法混合使用serialize方法的结果来构建要作为数据发送的js对象。

只需使用serialize的结果作为ajax调用的数据属性值,并在查询字符串中传递名称。

$("#SavePresetButton").on("click", function () {
    $.ajax({
        type: "POST",
        url: '@Url.Action("SavePreset", "Reports")?name='+$("#PresetNameEditor").val(),
        data: $("#UpdateForm").serialize()
    }).done(function(result) {
        console.log(result);
    });
});
相关问题