文字列を受け取り、JsonResult を返す Controller アクションがあります。
public JsonResult GetMemberJSON(string memberNumber)
{
var t = new { foo = memberNumber }; // does more crap, greatly simplified here....
return Json(t, JsonRequestBehavior.AllowGet);
}
そして、そのビューから実行される JavaScript がページロード時に JSON を表示できるように、その JSON をビューの HTML に直接「印刷」したいと考えています。この JSON で Ajax を使用したくありません。この JSON を何らかの形でコードで取得できないと断言できる理由はありません。
この JSON を保持する必要がある私の ViewModel は次のとおりです。
public class MakePaymentViewModel : IValidatableObject
{
public MyClassBlah Blah { get; set; }
public string MemberJSONInfo { get; set }
public void LoadThings(string memberNumber)
{
this.Blah = MyClassBlah.Get(memberNumber);
this.MemberJSONInfo = ""; // what goes here???
}
}
そして、JSON 文字列を JavaScript コードとして処理するビューは次のとおりです。
<div>
<script>
$(document).ready(function () {
var json = @(new HtmlString(Model.MemberPACJSONInfo)); // mixing JS and Razor here....
Library.PaymentDetailManager.BlockPACFieldsAsNeeded(json);
});
</script>
</div>
Controller アクションが JsonResult ではなく String を返す場合、これを機能させることができることはわかっていますが、それは私には間違っていると感じています。また、System.Web.Script.Serialization.JavaScriptSerializer() を介して JsonResult を実行すると (これはばかげているように思えます)、有効な JSON が得られますが、次のようになります。
// viewmodel
var cont = new MembershipCenter.Controllers.MembershipController();
var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonResult = cont.GetMemberJSON(this.Member.Id);
this.MemberPACJSONInfo = oSerializer.Serialize(jsonResult);
// here's how it renders in the View
{"ContentEncoding":null,"ContentType":null,"Data":{"foo":"990006"},"JsonRequestBehavior":0}
上記は私が求めることができる最高のものですか?うまくいくと思いますが、なぜ JsonResult で ToString() を呼び出しても JSON が出力されないのでしょうか?