Как я могу обернуть мой результат действия JSON в <textarea> - PullRequest
1 голос
/ 24 марта 2012

У меня есть форма на веб-странице, которую я отправляю, используя плагин jquery form. Эта форма включает в себя вариант загрузки файла. Действие MVC3, которое я публикую, возвращает JSON. Поскольку плагин возвращается к использованию iframe в старых браузерах, вам нужно заключить JSON в

<textarea>JSON data...</textarea>

Я попытался изменить тип возвращаемого значения действия на строку и просто добавить текстовую область тегами для объекта JSON. ToString (), но не получилось. Как мне обернуть мой результат JSON в текстовое поле, когда! 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 Ответ

2 голосов
/ 28 марта 2012

Чтобы решить эту проблему, я унаследовал от JsonResult и добавил туда текстовую область

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;
    }
...