私はこれについてしばらく頭を悩ませてきましたが、SOコミュニティにそれを試してもらうことにしました...
クライアント側からの POST に応答して単純なタスクを実行し、JsonResult
成功した場合は単純なブール値の「成功」プロパティを持つ匿名クラスからビルドされた を返すアクションがいくつかあります。アクションが失敗した場合はエラーPartialViewResult
付きで を返します。ModelState
<HttpPost()> _
Public Function UpdateHeader(ByVal header As XmlReturnHeader) As ActionResult
If ModelState.IsValid Then
Dim updated As Integer = TaxRepository.XmlReturnHeader.Update(header)
If updated = 1 Then
Return Json(New With {.Success = True}, JsonRequestBehavior.AllowGet)
End If
End If
Return PartialView("Maintenance/Header", header)
End Function
クライアント側のコードも同様に単純です。結果にSuccess
プロパティがあるかどうかを確認したいのですが、それが本当にあったことを確認してtrue
から、そこから進みます。
$.post('<%= Url.Action("UpdateHeader") %>', $(this).serialize(), function (data) {
if (data.Success && data.Success === true) {
$('#list').trigger('reloadGrid');
$('#edit').dialog('close');
} else { // result must be the HTML
$('#edit').html(data);
}
});
ただし、テストで問題が発生しました。コールバック関数から受け取るオブジェクトは、常に次のdata
ようになります。
{ success: true }
^
s
insuccess
は小文字で、JS では大文字と小文字が区別されるため、問題があります。
奇妙な部分は、VB.NET コードを次のように変更した場合です。
Return Json(New With {.Garbage = True}, JsonRequestBehavior.AllowGet),
受け取ります
{ Garbage: true }
に戻すとNew With { .Success = True }
、小文字の が再び表示されますs
。
テストには IIS と IE9 を使用しています。どういうわけかレスポンスがキャッシュされているような気がします。JsonResult
アプリケーションには、匿名パラメーターのプロパティとして小文字の「成功」を使用する場所が他にもあります。おそらく、IIS は以前の GET または POST 要求からの応答をキャッシュしていますか?
[アップデート]
応答キャッシュ理論をテストするために、コードを次のように変更しました。
Return Json(New With {.Success = True, .Random = DateTime.Now.Ticks},
JsonRequestBehavior.AllowGet)
これにより、クライアント側で正しい応答が受信されました。偉大な。しかし、一体何が起こっていたのですか?POST はキャッシュから除外されていると思いましたか? それとも、リクエストのみで、レスポンスはありませんか?
今後これを回避するにはどうすればよいですか?
[アップデート]
もう 1 つのヒント: jQuery を介してリクエストのキャッシュをグローバルに無効にしていOutputCacheAttribute
ますが、サーバー側で採用されている s やそのような「キャッシュなし」メカニズムはありません。コントローラー全体をすばやく平手打ち<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>
し、JSON からプロパティを削除しました.Random
が、まだ{ success: true }
.
アプリケーション プールをリサイクルし、Temporary .NET ファイルを削除し、ブラウザのキャッシュをクリアしましたが、同じ問題が解決しません。