当我从ajax(通过jquery)发帖时,我无法让模型绑定到我的动作上。
型号:
public class NoteEditViewModel
{
public bool AddMode { get; set; }
public int ID { get; set; }
public int PersonID { get; set; }
public string Note { get; set; }
public NoteEditViewModel()
{
}
}
动作:
[HttpPost]
public ActionResult Edit(NoteEditViewModel note)
{
...
}
JS :(实际上是打字稿)
$.ajax({
url: this.options.editUrl,
method: 'POST',
data: JSON.stringify(this.convertFormToJSON(this.options.noteFormElement)),
//data: $(this.options.noteFormElement).serialize(),
//data: JSON.stringify({
// AddMode: $("#AddMode").val(),
// ID: $("#ID").val(),
// PersonID: $("#PersonID").val(),
// Note: $("#Note").val()
//}),
//dataType: 'json',
//traditional:true,
//contentType: 'application/json; charset=utf-8',
success: (partialResult) => {
this.options.noteModalElement.modal('hide');
}
});
convertFormToJSON(form : JQuery) {
var array = form.serializeArray();
var json = {};
jQuery.each(array, function () {
json[this.name] = this.value || '';
});
return json;
}
你可以看到我在这里尝试过的东西。该操作将接收模型的空实例或null。
我确实设法使用自定义ModelBinder,因此:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var body = controllerContext.RequestContext.HttpContext.Request.Form[0];
var model = JsonConvert.DeserializeObject<NoteEditViewModel>(body);
return model;
}
这可能不是最好/最安全的,但至少它有效。
我无法看到我在这里做错了什么,但为每个模型创建一个模型绑定器似乎很疯狂。非ajax帖子似乎工作正常。
由于
答案 0 :(得分:3)
您不需要自定义ModelBinder
。您的值将使用
$.ajax({
url: this.options.editUrl,
method: 'POST',
data: $('form').serialize(),
success: (partialResult) => {
this.options.noteModalElement.modal('hide');
}
});
模型在POST方法中没有绑定的原因是因为参数的名称(note
)也是模型中属性的名称,而DefaultModelBinder
设置了属性的值Note
已发布的值,但也尝试将NoteEditViewModel
的实例设置为失败且模型变为string
null
)
将方法的签名更改为
[HttpPost]
public ActionResult Edit(NoteEditViewModel model)
你的模型将被正确绑定