0

文字列を受け取り、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 が出力されないのでしょうか?

4

3 に答える 3

0

ToString() は JsonResult または ActionResult でオーバーライドされないため、ToString() の呼び出しは機能しません。ActionResults は、ExecuteResult() が呼び出されたときに http 応答に直接書き込むことによって機能します。

以下は、JsonResult.ExecuteResult() のスニペットです。同じコードを使用して、「t」を MemberJSONInfo にシリアル化できます。JsonResult 全体をシリアライズしようとしないでください。

  if (Data != null) {
     JavaScriptSerializer serializer = new JavaScriptSerializer();
     response.Write(serializer.Serialize(Data));
  }
于 2012-11-07T14:43:38.733 に答える
0

コードを依存関係にリファクタリングできればvar t = new { foo = memberNumber };、それを複数のコントローラーで使用できます。

コントローラーをインスタンス化してそのメソッドを消費するのは良い考えだとは思いません。

于 2012-11-08T21:57:18.943 に答える
0

ViewData ディクショナリを使用して JSON を保存し、JSONResult の代わりに ActionResult を使用して、この ViewData をビューで使用できます。

于 2012-11-07T14:35:47.993 に答える