2008-12-10 108 views
2

我已經繼承了基於webforms構建的ASP.NET應用程序,並且該應用程序因將其所有業務邏輯嵌入代碼隱藏而受到影響。因此,此應用程序不能進行單元測試。我想將每種形式的功能分解爲MVC風格,但是我發現ASP.NET拒絕我的每一個努力來重構它。在一般情況下,我喜歡我的單獨MVC類如下:使用ASP.NET webforms的MVC


public class LoginModel 
{ 
    public string Username, Password; 
    public bool IsAuthenticated; 
} 

public interface ILoginView 
{ 
    event Action UserLoggedIn; 
    void SetMode(bool isAuthenticated); 
} 

public class LoginController 
{ 
    ILoginView View; 
    LoginModel Model; 

    public LoginController(ILoginView view, LoginModel model) 
    { 
     this.View = view; 
     this.Model = model; 

     // hook onto view events 
    } 
}

一旦我有我的課設置和很好的單元測試,我可以實現我的用戶控件或頁面ILoginView接口:


public class LoginView : UserControl, ILoginView 
{ 
    public LoginView() : base() 
    { 
     new LoginController(this); // registers view with the controller 
    } 
} 

如果這是一個winform應用程序,它將美化工作。但是,ASP.NET生命週期會導致這種風格崩潰。

  • ASP.NET創建並破壞每個頁面加載的視圖。由於我的控制器是由視圖保存的,所以模型由控制器保存,每次回發都會導致我的頁面失去其狀態。

  • 我可以通過在用戶會話中持有我的控制器來解決上述問題,但這會帶來一系列問題。特別是,在會話中放置控制器會導致內存問題,因爲在會話過期之前,模型和控制器不會被垃圾回收回收。從頁面到頁面的導航可創建數十個控制器,但是當用戶離開頁面時,控制器不會自行處理。

  • 由於視圖在每次回發時被銷燬/重新創建,因此我必須在每次回發時重新註冊與控制器的視圖。這比聽起來更難,因爲模型的狀態需要在每次回發時被複制回View,但同時我們不想覆蓋用戶對上次回發中所做的View的更改。當處理使用此MVC風格的動態創建或AJAX控件時,您不知道會變成什麼樣的額外噩夢。

我知道我這得太多,有一個更簡單的方式來獲得我想要的結果,但我怎麼正確地實現了MVC的風格使用的WebForms?

+0

如果你必須堅持使用DNN,那麼我認爲你最好的選擇就是堅持使用Web表單實現,並且只是將代碼背後的業務邏輯清理乾淨。MVC做的很好,但是試圖混合模型很困難,正如你發現的那樣。 Web表單並不差,它只是不同於MVC。擁抱webforms的好感。 – 2010-02-04 18:27:59

回答

1

使用asp.net mvc重寫這個文件是不是更容易?

+0

不,該項目基於DotNetNuke,因此它與ASP.NET MVC不兼容。 – Juliet 2008-12-10 16:27:43

1

因爲它似乎你必須重新寫。無論是完全MVC(並停止使用DNN),或更好的WebForms實現(意思是,從顯示分離邏輯,並考慮到頁面生命週期問題)。還有第三種選擇 - 結合MVC和ASP.NET WebForms,但您應該仔細考慮並考慮平臺中的所有變量。

0

那麼,回發的本質是支配你的狀態變化,所以你應該對此作出反應。你使用的任何框架都會以幾乎相同的方式工作,它會用每個請求重建/綁定狀態。你應該看看你的用戶會話中的狀態(讀取數據)。

0

ViewState應該用於將所有加載的數據存儲在WebForms中,因此只有在創建頁面時纔可以實現控制器,無需在用戶會話中存儲任何對象。