如何将我的JSON操作结果包装在<textarea> </textarea>中

时间:2012-03-24 02:33:45

标签: json asp.net-mvc-3 jquery-forms-plugin

我在网页上有一个表单,我使用jquery表单插件提交。此表单包含文件上载选项。我发布的MVC3操作返回JSON。由于插件在旧浏览器上使用iframe,因此您需要使用

包装JSON
<textarea>JSON data...</textarea>

我尝试将操作的返回类型更改为字符串,只是将文本区域标记附加到JSON对象.ToString()但是没有去。我怎样才能将我的JSON结果包装在textarea中!Request.IsAjaxRequest()

以下是我尝试将JSON作为字符串返回的示例(不起作用)

[HttpPost]
    public string CreateEntry(EntryCreateViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return WrapInTextArea(!Request.IsAjaxRequest(), Json(new object[] { false, 0, this.RenderPartialViewToString("_EntryCreateFormPartial", model) }).ToString());
        }

这适用于现代浏览器,但我怀疑(基于文档)在使用iframe的旧浏览器中会失败

[HttpPost]
    public ActionResult CreateEntry(EntryCreateViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return Json(new object[] {false, 0, this.RenderPartialViewToString("_EntryCreateFormPartial", model)});
        }

1 个答案:

答案 0 :(得分:2)

为了解决这个问题,我从JsonResult继承并在那里添加了textarea

using System;
using System.Web.Mvc;
using System.Web.Script.Serialization;

namespace TinyHouseMap.Web.Infrastructure.Results
{
    public class JsonInIframeResult : JsonResult
    {
        public bool EncloseInTextArea
        {
            get;
            set;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if ((JsonRequestBehavior == JsonRequestBehavior.DenyGet)
                && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("JsonRequest GetNotAllowed");
            }

            var response = context.HttpContext.Response;

            response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }

            if (Data != null)
            {
                var serializer = new JavaScriptSerializer();

                string results;
                if (EncloseInTextArea)
                {
                    results = "<textarea>" + serializer.Serialize(Data) + "</textarea>";
                }
                else
                {
                    results = serializer.Serialize(Data);
                }


                response.Write(results);
            }
        }
    }
}

然后在我的控制器基类

中创建了一个帮助器
protected JsonInIframeResult JsonInIframe(object data, string contentType, bool encloseInTextArea)
    {
        var result = new JsonInIframeResult {Data = data, ContentType = contentType, EncloseInTextArea = encloseInTextArea};
        return result;
    }