それで、私はこれで壁に頭をぶつけてきました、そして私はこれのための良い情報源を見つけることができません。MVC3でモデルバインディングがどのように機能するかを忘れているかもしれませんが、これが私がやろうとしていることです。モデルの編集を処理するために、Knockoutにバインドされたエディターがあります。モデルにはあまりありません:
public class SetupTemplate
{
public int Id { get; set; }
public string Name { get; set; }
public string Template { get; set; }
}
私が呼び出そうとしているアクションのシグネチャは次のとおりです。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateTemplate(SetupTemplate template)
ここでの別の質問から、偽造防止トークンを取得するために、このかなり役立つスニペットを選択しました。
window.addAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
これはすべて、ajaxを介して更新を投稿しようとしている私と一緒になります:
payload = window.addAntiForgeryToken(ko.mapping.toJS(self.data));
$.ajax({
type: "post",
url: endpoint,
data: payload,
success: function(data) {
//Handle success
}});
これにより、Chromeデベロッパーツールのフォームデータセクションが表示されます
Id:1
Name:Greeting
Template: [Template Text]
__RequestVerificationToken: [The really long anti-forgery token]
偽造防止トークンが取得されましたが、私のモデルはnullです。これについて私が見たほとんどの例では、モデルではなく、渡された単一のパラメーターを使用しています。
私は明らかな何かを見逃していると確信しています、それが何であるかについての洞察はありますか?
編集:@Markに応答して、呼び出しを次のように変更します。
$.ajax({
type: "post",
dataType: "json",
contentType: 'application/json',
url: endpoint,
data: JSON.stringify(payload),
success: function(data) {
//Do some stuff
}});
結果は次のリクエストペイロードになります。
{"Id":1,"Name":"Greeting","Template":"...","__RequestVerificationToken":"..."}:
そして、サーバーは偽造防止トークンを取得していません。contentType
これは、へのパラメータがある場合とない場合の両方で試されました$.ajax()
。