3

ページの JavaScript を読み込むために requirejs を使用しています。ファイルから動的に読み取り、Newtonsoft JObject を使用して JSON を返す webApi ルートがあります。クライアント側では、結果を取得してローカルの 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 をクライアントに返します。これは単一ページのアプリであるためです。RequireJS を使用してロードできるように、Web API から JavaScript を返したいと思っていました。JSON として動作するようになりました。

リソース ファイルを読み取り、JSON として返す WebApi メソッドを次に示します。

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 最適化メソッドに対してテストしたところ、ネストされた require を解決できました。願わくば、これが翻訳をクライアントに渡す方法や、RequireJS を使用して動的モジュールをロードする方法について、他の誰かの助けになることを願っています。

WebApi で JavaScript を返す方法を知っている人がいたら、ぜひ教えてください。

乾杯!

4

1 に答える 1

4

次の質問が必要です: ASP.NET Web API にプレーン テキストを強制的に返す方法はありますか?

を作成する必要はありません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",...}
于 2013-09-26T19:11:15.813 に答える