2016-08-28 70 views
0

ajaxから(jquery経由で)投稿するときに、アクションにバインドするモデルを取得できません。ajax投稿でASP.Net MVCモデルがバインドされない

モデル:

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; 
    } 

これは最高の/最も安全ではないかもしれないが、少なくともそれが動作します。

私がここで間違っていることはわかりませんが、モデルごとにモデルバインダーを作成するのは狂っているようです。非アヤックスの投稿はうまくいくようです。

おかげ

+0

'データを試してみてバインドされます。JSON.stringify({注:this.convertFormToJSON(this.options.noteFormElement}))、' – Developer

答えて

2

カスタムModelBinderを必要としません。あなたの値は正常にパラメータ(note)の名​​前もモデル内のプロパティ名で、DefaultModelBinderが設定されますので、あなたのモデルはPOSTメソッドにバインドされていない理由がある

$.ajax({ 
    url: this.options.editUrl, 
    method: 'POST', 
    data: $('form').serialize(), 
    success: (partialResult) => { 
     this.options.noteModalElement.modal('hide'); 
    } 
}); 

を使用して送信されます失敗し、モデルがnull

変更

にメソッドのシグネチャとなる転記値プロパティ Noteの値だけでなく、その値に NoteEditViewModelのインスタンスを設定しようとする( string

、あなたのモデルは正しく

+0

OMGを。私はそれがそれのような何かばかげた/単純なものだったと推測していたはずです。私は数日間このことにつぶやきました。私はあなたにビールを借りている! :) – Jonesie

関連する問題