我需要传递我的模型,以这种形式构建:
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
也是大手动解析它。
答案 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);
});
});