ASP.Net MVC模型不会绑定在ajax帖子上

时间:2016-08-28 03:26:26

标签: ajax asp.net-mvc

当我从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帖子似乎工作正常。

由于

1 个答案:

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

你的模型将被正确绑定