9

我對MVC應該如何工作仍然有些困惑。真實世界MVC - 處理形式

可以說我有一個網站賣小部件。我有一個列表頁面,/widgets/list和產品頁面/widgets/product/123

這兩個都可以使用widget控制器,並調用listproduct方法 - 迄今爲止足夠簡單。可以說,我也有其他幾個控制器的各種事情。

現在我添加一個新聞快報註冊框到我的標題 - 即在網站的每個頁面上。 這是如何工作的?我知道它應該提交到/newsletter/signup

但是如果出現錯誤(說你沒有正確填寫你的電子郵件地址)會發生什麼?它應該顯示你所在的任何頁面(例如/widgets/list),但newsletter控制器需要運行。 widget控制器不知道newsletter控制器,所以我不能把代碼放在那裏......這應該如何工作?

編輯:沒有AJAX請 - 我更容易理解。考慮到這是JavaScript禁用時的回退。

編輯2:任何實例或教程涵蓋這種事情會非常讚賞

編輯3:是否允許的視圖調用一個動作?例如,標題可能會調用Newsletter->index()

回答

0

您必須將錯誤消息放在某個全局位置,其中頁面控制器(其中包含「子控制器」newsletter)可以將其選中。

在AJAX的情況下,您可以讓newsletter控制器與DIV對話,因爲它可見(因爲您沒有重新加載整個頁面)。爲此,您需要在AJAX請求完成時調用頁面中的一段JavaScript代碼,該代碼將字符串放在需要的位置。

0

我的MVC的經驗是更實際和少「書上說什麼」,但這裏有雲:

你就會有一個基本的控制器類(在CakePHP的 - 這是我最熟悉的 - 它是稱爲AppController),這是所有其他控制器的子類別。這門課將實施你所談論的所有「全球」內容。

實例:

以我AppController類中,框架限定了基本上是執行在每個頁面加載一個beforeFilter()回調。這是我要檢查註冊表單是否已提交併適當處理的地方。如果註冊不知何故,我會在會話中添加一些指示,我的觀點會簡單地檢查是否存在源自時事通訊模型的錯誤列表,如果他們在那裏,則顯示它們。

這可能是在螺母和螺栓較重和較輕的理論而不是你問的有點,但我有任何這廢話沒有正規的培訓,讓有我最好的:)

1

一個字段添加到簡報表格,用於存儲當前頁面的URL。 在提交新聞簡報時發生錯誤時,檢索URL並重定向到該頁面。假如你把錯誤信息放在正確的地方,它應該被每個頁面中包含的新聞簡訊形式提供。

0

對於應該返回一些驗證錯誤等的小部件 - 使用partial requests(或MvcContrib的子控制器)+ AJAX。

0

我所做的是將每個表單發送到自己。在控制器中,我檢查是否設置了post變量;如果是這樣,我做驗證。如果驗證成功,我會重定向到另一個頁面。如果失敗,表單頁面會重新加載錯誤消息。這使得它很容易,並減少代碼重複。看到這裏:

**in controller**: 

If post variable is set: 
    validate form 

    if form is validated: 
     redirect to new page (or whatever) 
    else: 
     add error messages to the $data variable of the view 
    endif 

endif 

//$data contains whatever information you'd normally pass to the view. 
//if there was a validation error, the messages are added to the $data variable 
show view with $data variable 

正如你所看到的,流程總是貫穿到單個視圖加載語句。但是,如果驗證成功,您將被轉到另一頁面。

+0

如果我有一個包含10個控制器的現有網站,每個控制器有5個操作,這並不意味着如果我在報頭中添加了新聞簡報註冊,那麼我將不得不編輯50個功能。 – Greg 2009-09-16 14:30:34

+0

那麼這將是它發佈到一個單獨的頁面的例外。大多數表單不會出現在多個頁面上,只有通訊,登錄和註冊等內容。總的來說,以上是非常有效的。 – ryeguy 2009-09-16 17:00:04

6

我不明白爲什麼每個頁面上的時事通訊框的錯誤消息必須在同一頁面中呈現。如果您有一個發佈到另一個操作的頁面 - 與當前視圖完全無關(例如 - 搜索),那麼沒有理由在原始頁面中顯示錯誤消息。你會在同一頁面上顯示成功消息嗎?在哪裏處理?

新聞簡報表格的錯誤消息應顯示在致力於新聞簡報的視圖中。例如,看看它如何在Stackoverflow中完成 - 進入搜索框並輸入任何內容,只需按Enter即可。這是一種錯誤,因爲您沒有指定要搜索的內容。然後,Stackoverflow會將您帶到另一個頁面,解釋搜索工作的方式。

現在爲什麼這樣做?原因很簡單 - 用戶在某個頁面上並選擇參與與當前頁面無關的活動,因此沒有理由將其保留在那裏。

+0

儘管我可以想象OP想要返回原始視圖,但我可能也會選擇您的建議方法。 – 2009-09-17 04:23:19

+2

要添加到:要保持用戶最後一個位置的「標記」,您可以使用cookie或追加一個查詢字符串到URL。例如:'/ newsletter/signup?return_to = widgets/list' – 2009-09-17 04:41:36

+0

+1在我看來,將用戶重定向到另一個控制器以通知成功/失敗是完全可以接受的。 – 2009-09-17 18:57:46

0

如何在提交到/ newsletter/signup控制器的頁面上添加一個隱藏字段,以及控制器完成後要去的地址即當前頁面(或者您可以使用referer http標頭)。

此控制器然後將錯誤消息列表或成功消息添加到要由視圖呈現的對象列表,然後轉發到由上述隱藏字段指定的控制器上。這個控制器然後添加它的視圖中顯示的對象列表(例如小部件列表)。

然後在視圖中,您可以顯示來自新聞快遞控制器的錯誤消息(如果存在)。

1

有一個很好的ASP.net MVC中心tutorial描述了在MVC環境中包含小部件(可重用組件)的方法。

其基本思想是使用自己的請求管道設置小部件 - 不將它們合併爲一個組合的控制器/視圖,這會挫敗MVC的可維護性。