我正在使用requirejs为我的页面加载JavaScript。我有一个webApi路由,它从文件中动态读取并使用Newtonsoft JObject返回JSON。在客户端,我然后获取结果并将其分配给本地JavaScript变量。
define(['jquery'],function($){
function dynoFile() { $.get('/api/resources/dynofile', function (results) { myNamespace.dynoFile = results; }); } return new dynoFile(); });
此示例确实有效,但是它会导致其他希望myNamespace.dynoFile存在的JavaScript文件出现问题。由于这个文件加载得很好,其他文件不会等待$ .get完成。
是否可以让web api方法返回JavaScript并让浏览器将其识别为JavaScript而不仅仅是文本?我试图在web api中设置响应头,并以各种方式返回生成的脚本。
这可能吗?
更新
为了更详细一点,我使用我的Web API处理我的资源文件并将JSON返回给客户端,因为它是一个单页面应用程序。我希望从我的Web API返回JavaScript,我可以使用RequireJS加载。我现在以JSON的身份工作,并认为我会分享我拥有的东西。
这是我的WebApi方法,它读取资源文件并将其作为JSON返回:
public JObject Get()
{
var data = new JObject();
var type = typeof(Translations);
var properties = type.GetProperties();
foreach (var property in properties)
{
if (property.Name != "ResourceManager" && property.Name != "Culture")
{
data.Add( property.Name, property.GetValue(type, null).ToString());
}
}
HttpContext.Current.Response.Headers.Add("Content-Type", "application/json");
return data;
}
这是我的translations.js文件:
define(['jquery', 'underscore'], function ($) {
function translations() {
}
_.extend(translations.prototype, {
target: '/api/resources/translations',
getTranslations: function () {
return $.ajax({
url: 'api/resources/translations',
type: 'GET',
dataType: 'json'
});
}
});
return (translations);
});
由于我的其他几个文件依赖于现有的翻译,我需要在main.js中嵌套2个RequireJS语句:
requirejs(['application/translations', 'whatever other resources that can load that don't depend on translations'], function () {
var trans = new translations();
trans.getTranslations()
.done(function (result) {
// set translations into a variable, we chose it to be part of the global namespace
window.Translations = result;
// load remaining dependencies that require translations to exist
requirejs(['myotherjsfiles', 'blahblah', function () {
// you get the idea...
});
});
});
这允许我的翻译首先加载(使用任何非依赖文件,如bootstrap,jquery等),然后加载我所有的依赖JavaScript文件。我还针对RequireJs优化方法对此进行了测试,并且能够解决嵌套需求。希望这有助于其他人了解如何将翻译下载到客户端和/或如何使用RequireJS加载动态模块。
如果有人知道如何让WebApi返回JavaScript,我很乐意听到它!
干杯!
答案 0 :(得分:4)
你想要这个问题: Is there a way to force ASP.NET Web API to return plain text?
您不需要创建PlainTextFormatter
(我认为唯一的好处是在请求text/plain
时自动捕获?),您只需要一个辅助方法:
/// <summary>
/// Generate raw content from the given string output.
/// <para>See https://stackoverflow.com/a/13028027/1037948 and https://stackoverflow.com/a/11582207/1037948 </para>
/// </summary>
/// <param name="responseBody"></param>
/// <param name="mediaType"></param>
/// <returns></returns>
private HttpResponseMessage getRawResponse(string responseBody, string mediaType = "text/plain") {
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(responseBody, Encoding.UTF8, mediaType);
return response;
}
然后对于任何GetSomething
方法,你写:
public object GetMySomething1() {
return getRawResponse(string.Format(@"window.SomeValue = {{{0}}}",
string.Join(",",
Enum.GetValues(typeof(RandomEnum)).Cast<RandomEnum>().Select(o => string.Format("{0}:\"{1}\"", o, o)))
));
}
这导致请求/myapicontroller/getmysomething1/
(假设您的路线设置为允许操作)返回:
window.SomeValue = {RandomValue1:"RandomValue1",RandomValue2:"RandomValue2",...}