4

一部のデータをページに送信し、データが保存されたかどうかに応じて、真または偽の値を期待する Ajax リクエストがあります。私のコントローラーでは、すべてを行い、コンテンツを true または false の値に設定します。1つの変数を出力するためだけにビューを作成したくないので、ビューを使用する必要がなく、コントローラーのみを使用して単純な文字列を出力する方法があるかどうか疑問に思っていました。

4

3 に答える 3

5

ビューを完全に無効にすることはできないと思いますが、非常に簡単な回避策があります。1 つのビューを作成して、それを多くのアクションに使用できます。

ビューを作成したとしましょうviews/main/ajax.cfm。その中には何がありますか? 明らかに、最も簡単な方法は次のとおりです。

<cfoutput>#HTMLEditFormat(rc.response)#</cfoutput>

個人的には、JSON を返すのが好きです。これにより、必要に応じてstatusフィールドとデータを取得できます。このように、私のビューは次のようになります。

<cfheader name="Content-Type" value="application/json" />
<cfoutput>#SerializeJSON(rc.response)#</cfoutput>

とにかく、私たちの行動では、次のようなことをする必要があります:

// prevent displaying the layout
request.layout = false;

// force special view
variables.fw.setView("main.ajax");

// init response (according to the choice made earlier)
rc.response["status"] = "OK";
rc.response = "";

これにはもう 1 つの落とし穴があります。場合によっては、AJAX ページに直接アクセスしたくない場合 (ブラウザーで開くなど)、またはその逆の場合もあります。

CFWheels フレームワークにはクールなヘルパーがありisAjax、FW/1 への移植は簡単です。次のようなメソッドをコントローラーに追加するのと同じくらい簡単です。

/*
* Check if request is performed via AJAX
*/
private boolean function isAjax() {

    return (cgi.HTTP_X_REQUESTED_WITH EQ "XMLHTTPRequest");

}

実際、上記のセットアップ コードは、私のアプリのヘルパー メソッドでもあります。

/*
* Set up for AJAX response
*/
private struct function setAjax() {

    // prevent displaying the layout
    request.layout = false;

    // force special view
    variables.fw.setView("main.ajax");

    local.response["status"] = "OK";

    return local.response;

}

したがって、私のアクションコードでは、チェック全体が次のようになります。これは非常にコンパクトで便利です。

if (isAjax()) {
    rc.response = setAjax();
}
else {
    return showNotFound();
}

お役に立てれば。

于 2012-08-06T07:47:59.563 に答える
2

コントローラーから直接出力することはできません。コントローラーの仕事は、モデルを呼び出してデータをビューに渡すことだけなので、出力を行うにはビュー テンプレートが必要です。

ただし、フレームワークのsetView()メソッドを使用すると、コントローラー メソッドごとに個別のビューを作成する必要がなくなります。これにより、規則をオーバーライドして、単一のビューを複数のコントローラー メソッドに適用できます。したがって、一般的な「ajax ビュー」を設定し、それを使用して任意のコントローラーからデータを出力できます。

ビュー/メイン/ajax.cfm

<!---Prevent any layouts from being applied--->
<cfset request.layout=false>
<!--- Minimise white space by resetting the output buffer and only returning the following cfoutput --->
<cfcontent type="text/html; charset=utf-8" reset="yes"><cfoutput>#rc.result#</cfoutput>

コントローラ.cfc

function init( fw )
{
variables.fw=arguments.fw;
return this;
}

function getAjaxResponse( rc )
{
    rc.result=1;
    fw.setView( "main.ajax" );
}

function getAnotherAjaxResponse( rc )
{
    rc.result=0;
    fw.setView( "main.ajax" );
}
于 2012-08-06T08:35:23.357 に答える
1

Application.cfc で onMissingView を使用して、ajax 呼び出しの応答を処理できます。この方法では、コントローラー メソッドで追加のロジックを実行する必要はありません。

// Application.cfc 
function onMissingView(rc) {
  if(structKeyExists(rc, "ajaxdata") && isAjaxRequest()) {
    request.layout = false;
    content type="application/json";
    return serializeJSON(rc.ajaxdata);
  }
  else {
    return view("main/notfound");
  }
}

function isAjaxRequest() {
  var headers = getHttpRequestData().headers;
  return structKeyExists(headers, "X-Requested-With") 
         && (headers["X-Requested-With"] eq "XMLHttpRequest");
}

// controller cfc
function dosomething(rc) {
  rc.ajaxdata = getSomeService().doSomething(); 
}

これは、リクエスト コンテキストに ajaxdata キーがあり、本物の ajax リクエストであるかどうかを確認し、シリアライズ データを返します。そうでない場合は、 main.notfound ビューをレンダリングします

于 2012-08-06T08:27:41.007 に答える