2012-08-05 74 views
4

我有一個Ajax請求,它將一些數據發送到一個頁面,並根據數據是否已保存返回一個真實或錯誤的值。在我的控制器中,我會做所有事情,並將內容設置爲真或假值。我真的不想創建一個視圖來輸出1個變量,所以我想知道是否有一種方法,我不必使用視圖,只使用控制器輸出簡單的字符串。僅在FW1中使用控制器而不顯示視圖

回答

5

我相信你不能完全禁用視圖,但有一個非常簡單的解決方法:你可以創建一個視圖並將其用於許多操作。

比方說,我們已經創建了視圖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 = ""; 

還有一個抓把柄這一點。有時候你不希望直接訪問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(); 
} 

希望這會有所幫助。

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視圖

2

不能直接從Controller輸出:其作業只是調用Model並將數據傳遞給View,因此您需要一個視圖模板做輸出。

但是,您可以避免必須使用框架的setView()方法爲每個控制器方法創建單獨的視圖。這允許您覆蓋約定並將單個視圖應用於多個控制器方法。因此,您可以設置一個通用的「ajax視圖」,然後使用它來輸出來自任何控制器的數據:

views/main/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> 

controller.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"); 
} 
+0

謝謝。這就是我所假設的,但並不確定。 – 2012-08-06 13:15:11

相關問題