在Json结果之前输出一个变量名



我将JS本地化资源中存在的本地化键/值对输出到lang.js,如下所示:

    [Route("js/lang.js")]
    public ActionResult Lang()
    {
        ResourceManager manager = new ResourceManager("Normandy.App_GlobalResources.JsLocalization", System.Reflection.Assembly.GetExecutingAssembly());
        ResourceSet resources = manager.GetResourceSet(CultureInfo.CurrentCulture, true, true);
        Dictionary<string, string> result = new Dictionary<string, string>();
        IDictionaryEnumerator enumerator = resources.GetEnumerator();
        while (enumerator.MoveNext())
            result.Add((string)enumerator.Key, (string)enumerator.Value);
        return Json(result);
    }

/js/lang.js的内容是(我包含了一个正常的<script>标签的文件):

{"Test":"test","_Lang":"en"}

有没有办法使它们成为:

var LANG = {"Test":"test","_Lang":"en"}

您可以使用JSONP。编写自定义操作结果:

public class JsonpResult: ActionResult
{
    public readonly object _model;
    public readonly string _callback;
    public JsonpResult(object model, string callback)
    {
        _model = model;
        _callback = callback;
    }
    public override void ExecuteResult(ControllerContext context)
    {
        var js = new JavaScriptSerializer();
        var jsonp = string.Format(
            "{0}({1})", 
            _callback, 
            js.Serialize(_model)
        );
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.Write(jsonp);
    }
}

然后在控制器动作中返回它:

[Route("js/lang.js")]
public ActionResult Lang()
{
    ...
    return new JsonpResult(result, "cb");
}

,最后定义回调以在包含脚本之前捕获json:

<script type="text/javascript">
function cb(json) {
    // the json argument will represent the JSON data
    // {"Test":"test","_Lang":"en"}
    // so here you could assign it to a global variable
    // or do something else with it
}
</script>
<script type="text/javascript" src="js/lang.js"></script>

看起来您想要返回一个脚本,而不是json对象。在这种情况下,我会做以下两件事之一

  1. 返回一个封装脚本而不是json的操作结果(不确定是否存在)
  2. 返回json并将json设置为客户端的本地变量(典型的ajax调用)

最新更新