我有一個Ajax請求,它將一些數據發送到一個頁面,並根據數據是否已保存返回一個真實或錯誤的值。在我的控制器中,我會做所有事情,並將內容設置爲真或假值。我真的不想創建一個視圖來輸出1個變量,所以我想知道是否有一種方法,我不必使用視圖,只使用控制器輸出簡單的字符串。僅在FW1中使用控制器而不顯示視圖
4
A
回答
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");
}
相關問題
- 1. 使用MFMailComposeViewController而不顯示視圖控制器
- 2. 僅在視圖中可用角變量,而不是控制器
- 3. 在MVC3控制器中顯示視圖
- 4. 第二視圖控制器不顯示
- 5. popToRootViewControllerAnimated不顯示根視圖控制器
- 6. MVC +控制器視圖不顯示
- 7. UINavigationController不顯示根視圖控制器
- 8. 導航控制器不顯示視圖
- 9. Popover視圖控制器不顯示
- 10. 從視圖控制器顯示新的視圖控制器
- 11. MKMap註釋顯示視圖控制器,而不是彈出框
- 12. 展開UIStoryboardSegue而不顯示先前的視圖控制器
- 13. Swift顯示視圖僅在首次啓動時使用導航控制器
- 14. Swift:UIScrollView不顯示使用XLPagerTabStrip的子視圖控制器
- 15. 在分割視圖控制器主視圖控制器未顯示
- 16. IBOutlets和IBActions不顯示在main.storyboard中的視圖控制器
- 17. 模式視圖控制器不顯示在中心
- 18. 爲什麼在applicationDidFinishLaunchingWithOptions中不顯示模式視圖控制器?
- 19. 調用視圖控制器類而不彈出視圖控制器本身
- 20. 視圖容器不顯示錶視圖控制ios
- 21. iPhone:容器視圖控制器和相機預覽:預覽不顯示在子視圖控制器中
- 22. 限制從詳細視圖控制器顯示根視圖控制器
- 23. 串在角HTML視圖,而不是使用控制器
- 24. UITableView刷新顯示視圖控制器
- 25. 如何顯示視圖控制器
- 26. 顯示視圖控制器與筆尖
- 27. 觸發控制器顯示視圖
- 28. iPad - 從顯示的模式視圖控制器顯示視圖控制器作爲子視圖
- 29. 如何使用視圖和控制器顯示圖像ASP.NET MVC
- 30. 不能在現有tableview控制器上顯示.xib視圖控制器
謝謝。這就是我所假設的,但並不確定。 – 2012-08-06 13:15:11