2013-11-10 6 views
1

У меня есть действие, которое возвращает JsonResult.
Я хочу перехватить JsonResult и обернуть его строкой.Перехватить JsonResult и обернуть его (как строку)

Что-то вроде:

public class JsonProxyAttribute : FilterAttribute 
    { 
     void OnActionExecuting(ExceptionContext filterContext) 
     { 
      var res = filterContext.Result as string; 
      if (res != null) 
      { 
       filterContext.Result = "func("+filterContext.Result+")"; 
      } 
     } 
    } 

Так Аякса вызов получите это:

func({"MyContent":"content"}) 

вместо этого:

{"MyContent":"content"} 
+0

... Я не думаю, что вы хотите, действует в формате JSON. Это JavaScript OBJECT Notation, не думаю, что у json могут быть функции ... – danludwig

ответ

2

Что вам нужно, чтобы создать новый ActionResult что будут распространяться на JsonResult и представлять JSONP

public class JsonpResult : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     HttpResponseBase response = context.HttpContext.Response; 
     response.ContentType = ContentType ?? "application/x-javascript"; 
     response.ContentEncoding = ContentEncoding ?? System.Text.Encoding.UTF8; 

     if (Data != null) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string ser = serializer.Serialize(Data); 
      response.Write("func(" + ser + ");"); 
     } 
    } 
} 

Теперь, если вы хотите перехватить регулярные результаты JSON, ваш ActionFilter будет выглядеть так.

public class JsonProxyAttribute : FilterAttribute 
{ 
    void OnActionExecuting(ExceptionContext filterContext) 
    { 
     var res = filterContext.Result as JsonResult; 
     if (res != null) 
     { 
      filterContext.Result = new JsonpResult 
      { 
       ContentEncoding = res.ContentEncoding, 
       ContentType = res.ContentType, 
       Data = res.Data, 
       JsonRequestBehavior = res.JsonRequestBehavior 
      }; 
     } 
    } 
} 

Или вы можете использовать JSONP непосредственно в контроллерах

public ActionResult Jsonp() 
{ 
    var model = new List<string> { "one", "two" }; 
    return new JsonpResult 
    { 
     Data = model, 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet 
    }; 
} 
Смежные вопросы