【问题标题】:ASP.Net MVC Model wont bind on ajax postASP.Net MVC 模型不会绑定在 ajax 帖子上
【发布时间】:2016-08-29 07:13:25
【问题描述】:

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

谢谢

【问题讨论】:

  • 试试data: JSON.stringify({ note: this.convertFormToJSON(this.options.noteFormElement})),

标签: ajax asp.net-mvc


【解决方案1】:

您不需要自定义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)

你的模型将被正确绑定

【讨论】:

  • 天啊。我应该猜到这是一些愚蠢/简单的事情。这几天我一直在纠结这个。我欠你啤酒! :)
  • 哇 - 我读了这个答案并忽略了它,最后回来并实际阅读它以供理解,是的,这正是我一直遇到的问题:face_palm:
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多