0

所以我有一个控制器动作,它接受一个字符串并返回一个 JsonResult:

public JsonResult GetMemberJSON(string memberNumber)
{
      var t = new { foo = memberNumber }; // does more crap, greatly simplified here....
      return Json(t, JsonRequestBehavior.AllowGet);
}

我想将该 JSON 直接“打印”到视图的 HTML 中,以便从该视图运行的 JavaScript 可以在页面加载时看到 JSON。我不想在这个 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>

我知道如果控制器操作返回 String 而不是 JsonResult,我可以让它工作,但这对我来说感觉不对。此外,如果我通过 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() 不起作用,因为 ToString() 在 JsonResult 或 ActionResult 中都没有被覆盖。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

您可以使用 ViewData 字典保存 JSON 并使用 ActionResult 而不是 JSONResult 并在视图中使用此 ViewData

于 2012-11-07T14:35:47.993 回答
0

如果您可以将代码var t = new { foo = memberNumber };重构为依赖项,则可以在多个控制器中使用。

我不认为实例化控制器并使用它的方法是个好主意。

于 2012-11-08T21:57:18.943 回答