2010-08-11 66 views
4

我必須在我的MVC應用程序中構建一些ascx部分視圖來封裝可重用的功能以及歸檔SOR和SOC。但是,我遇到了如何封裝驅動MVC ascx視圖的業務邏輯的挑戰。MVC:如何在MVC ascx局部視圖中封裝邏輯與webforms ascx控件具有相同的效率?

在webforms中,ASCX控件背後的代碼可以處理按鈕單擊事件,瀏覽器仍然只顯示一個回發的同一頁面。我如何在MVC中歸檔相同的東西?當〜/ Address/Edit/2包含一個帶有一個按鈕的ascx局部視圖時,它會調用另一個MVC動作 - 讓我們假設〜/ ShareController/CommonAction - CommonAction返回到相同視圖的最佳方式是什麼? ascx文件?

也許我錯過了MVC web開發中的常見模式?

謝謝

最大

更新:這是關於我要尋找的模式更多的描述:

應該是一個地址編輯器的局部視圖。它可以驗證地址,顯示 驗證錯誤並將信息保存回數據庫。

地址編輯器將坐在許多具有不同控制器/操作的頁面上。

在經典的webform中,一個ascx控件可以通過多次回發完全與用戶進行交互,而無需更改導致整個頁面處理過程的url dor。 MVC中類似場景的正確模式是什麼?

更新2:

不知道這有什麼用網頁表單的狀態(statefullness)。完全不同的功能。這是關於控制器調用另一個子控制器(或子控制器)來處理局部視圖。在本評論最後看到我的例子。

我只是想達到相同的封裝和關注的分離等級。如果MVC框架沒有,那是一個嚴重的弱點。

在MVC中,我們怎麼能有一個「事物」(或缺乏更好的替代方案的部分視圖)能夠處理演示文稿以及邏輯並駐留在另一個父頁面中而沒有任何干擾?

我的理解是,MVC中的部分視圖只是演示文稿,不能在不干擾主控制器的情況下擁有專用控制器。我希望我錯了

爲了給你另一個例子,考慮這個網頁,你正在閱讀「stackoverflow.com/questions/{id}」。它包含一個「添加評論」組件。添加評論可能會做服務器端驗證,以防止無效評論。你怎麼能創建一個端到端的「添加評論」組件,它可以駐留在任何頁面上並處理必要的控制器邏輯?我能想到的唯一方法是修改主機頁面的控制器,以便能夠提供用戶驗證消息並要求他們通過回發來糾正錯誤。這意味着您將組件添加到10個不同的頁面,您必須修改10個不同的控制器。殺死「幹」

我希望我錯了!因爲我喜歡MVC軟件。

結論:

標誌着我肯尼的答案回覆;但是,我認爲這是MVC框架從封裝,可重用性和DRY主體角度看的一個嚴重弱點。

我的意見與webforms的statefullness無關。

請允許我解釋一下:

在網絡表單,您可以100%在ascx控件和課程相關的DLL CLASSLIB的封裝複雜的功能。一(1)名開發人員可以花幾個星期來開發它。一旦他的工作完成,沒有人需要知道任何事情,只是使用它。用戶控件可以在許多頁面中重複使用,而不會打擾其他「開發人員用戶」使用ascx組件中的詳細活動。

相比之下,您絕對不能在ASP.NET MVC中實現與ascx部分需要與用戶交互的相同內容。一旦ascx需要交互,它需要它自己的控制器,控制器需要保存ModelState。

Jeremy Skinner在MVCContrib中引入了[ModelStateToTempData]: http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ 但是,這只是一個補丁。

一個好的框架應該允許開發人員100%封裝他們的工作 - 控制,部分,ascx或其他 - 並將其交給團隊的其他成員,這樣他們就可以在不知道任何數據的情況下「使用它」。 Winform在許多複雜場景中完美實現了這一點。

儘管歡迎。

+0

您在特定場景中使用的局部視圖是什麼?按鈕點擊的目的是什麼? – 2010-08-11 05:39:29

+0

嗨Jeff, 剛剛添加了更多評論。謝謝。 – DevTeach2010 2010-08-11 13:23:34

回答

0

我不知道如果我把你的問題到100%,但你不能只提供用戶控制你需要的數據?

傳遞給<%= Url.Action()%>提交在點擊時轉到。如果您希望頁面重定向回到您在canredirect上的同一頁面並重新保存您的ModelState(http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx提示#13)。重定向可以通過引用來完成,也可以通過將操作和控制器名稱發送給操作方法來完成。

如果這不起作用,您可以隨時使用Ajax?

+0

Hi Kenny,謝謝你的幫助。你引用我的鏈接說:「MVCContrib項目也有這個功能,但他們正在做一個我不喜歡的類」你知道MVCContrib是什麼確切的功能嗎?再次感謝。 – DevTeach2010 2010-08-12 00:40:24

+0

是的,他們使用ModelStateToTempData過濾器。 – 2010-08-12 09:22:49

0

我幾乎可以肯定這不是它應該完成的工作,但我通常會查看referer URL並在那裏重定向。

+0

部分視圖需要通過幾次回發顯示驗證反饋時,重定向不起作用。當您重定向ModelState消失時。 – DevTeach2010 2010-08-11 13:25:07

+0

看起來,你陷入了WebForms的「有狀態」範例。從開發人員的角度來看,嘗試使Web應用程序「就像」Windows應用程序一樣工作,它很大程度上依賴於記住請求之間的表單狀態。另一方面,MVC採用Web應用程序來實現它:一系列獨立的請求。你應該設計你的應用程序,使你不需要有狀態。 – 2010-08-11 14:19:53

+0

Fyodor:請看我的第二次更新 – DevTeach2010 2010-08-11 16:48:58

0

我認爲正確的方式來處理這種類型的功能在MVC(和幾乎任何其他不是webforms)是通過ajax調用。

如您所見,創建完整頁面的回發將會非常棘手。但是,您可以通過將後期操作和驗證錯誤顯示合併到ajax操作中來完成所需的任何操作,該操作僅更新包含控件的頁面部分,而不是整個頁面。

0

我在找同樣的東西,我碰到Html.Action和.RenderAction似乎在服務器上執行控制器並返回/注入輸出。

這可以用於MVC中的封裝和可重用性,但我還沒有嘗試過。