2009-06-18 52 views
3

好吧,這對我來說是一個非常棘手的挑戰。我們正在將現有的ASP.NET網站轉換(僅重新設計PL)爲MVC。我們的網站非常複雜。但最難的部分是將現有的自定義控件轉換爲MVC equivilant。自定義控件(我不是在談論用戶控件)當然是一個繼承System.Web.UI.Control的類,並且始終使用該對象。例如,我們在這個現有的自定義類的,像這樣的頂部的一些屬性:將經典的ASP.NET自定義控件轉換爲MVC

Dictionary<int, Control> configControls; 
DropDownList kControl; 
CheckBox confirmBox; 

這些都是在傳統的ASP.NET類型的Web控件的變量。

所以我想我可以做什麼(無需從頭開始構建全新的自定義控件)就是使用HtmlHelper對象。所以,我想這一點:

(包括第一using語句,包括System.Web.MVC.Html我的新的自定義類的在我們的新的Web項目上)

私人的HtmlHelper幫手; 詞典configControls; helper.DropDownList

但這不起作用。我想我不能像這樣使用這個對象?我想我可以在字典中使用HtmlHelper,然後從助手中創建變量類型。但這些只是擴展方法,而不是對象

我不知道類似於我們可用於繼承的通用「控件」(如經典ASP.NET)的等價物。毫無疑問,它在MVC中不會是相同的(無狀態和完全不同的做事方式),但是我可以在MVC中使用相同的概念類型嗎?

所以我想我可以做什麼(無需從頭開始構建全新的自定義控件)就是使用HtmlHelper對象。所以,我想這一點:

(包括第一using語句,包括System.Web.MVC.Html我的新的自定義類的在我們的新的Web項目上)

private HtmlHelper helper; 
Dictionary configControls; 
helper.DropDownList 

,但是這是不工作。我甚至不知道這種方法是否可以在我的自定義控件中工作。當我嘗試使用我的助手變量時,我不會獲得任何擴展方法,除非它在已簽名傳入HtmlHelper參數的現有擴展方法中。所以,當我在外部自定義類中創建該私有變量時,智能感知可以在做「幫手」時進行選擇。所以我需要像這樣定義這個對象:?

private HtmlHelper htmlHelper = new HtmlHelper(); 

但它要求一個ViewContext和一個IViewDataContainer作爲參數。如果我構建了一個自定義的方法,它還不知道它的視圖(它不應該需要),因爲我只是在這個自定義類中創建HMTL字符串以傳遞給Extension方法以最終吐出字段,然後也許我不能像這樣在自定義類中使用HtmlHelper。

那麼我可以使用該對象而不是「控制」?也許我甚至可以在我的字典變量中使用類型對象來代替控制權?當我需要使用或引用字典中的值時,我不知道然後投射對象來鍵入HtmlHelper?但現在,我想我可以在Dictionary中使用HtmlHelper對象,然後從助手中創建變量類型。但這些只是擴展方法,而不是對象。

我希望在閱讀本文時,我可以對此有所瞭解。

+2

我看到「經典ASP.net」的大熱門:) – Hugoware 2009-06-18 14:15:49

+0

感謝您指出這一點。我無法理解這個問題有什麼奇怪的地方。 :) – 2009-06-18 14:19:31

回答

0

我會創建所需的業務邏輯,共享部分視圖(可能有相當多的結構良好的javascript行)和分離的控制器。

然後我會通過partial request技術使用這一堆代碼。

+0

嚴格的觀念後,閱讀。我沒有看到這將如何幫助我在CUSTOM控件中創建方法,這些方法一起形成HTML和控件的最終輸出到視圖的字符串。在這種情況下,我並不需要部分視圖。沒必要。我在這裏談論一個習俗課。返回表示並動態創建整個表單的html字符串的方法。 – PositiveGuy 2009-06-18 14:10:25

+0

我不認爲我們在這裏相同的波長 – PositiveGuy 2009-06-18 14:11:11

+0

你所描述的將是一個幫手。助手是一個靜態類的靜態方法,它根據提供的參數返回標記。 – 2009-06-18 14:15:36

4

我剛剛在這個昨晚的博客上寫了一些這可能對你有所幫助。

WebForms And MVC In Harmony — Almost…

基本上它討論了模擬 「器WebControls」 使用MVC一些選項。

此外,您仍然可以像以前一樣使用WebControls(如果他們需要諸如ViewState之類的東西,則可能無法正常工作)。我發現的問題是你與內聯呈現代碼和WebControls本身斷開了連接。

我昨天晚上寫了這個方法,可以讓你使用帶有內聯代碼的WebControls。

using System.Reflection; 
using System.IO; 
using System.Web.UI; 
using System.Web; 
using System.Web.Mvc; 

public static class MyExtensionMethods { 

//example method - renders a webcontrol to the page 
public static void RenderControl(this HtmlHelper helper, Control control) { 

    //perform databinding if needed 
    MethodInfo bind = control.GetType().GetMethod("DataBind"); 
    if (bind is System.Reflection.MethodInfo) { 
     bind.Invoke(control, null); 
    } 

    //render the HTML for this control 
    StringWriter writer = new StringWriter(); 
    HtmlTextWriter html = new HtmlTextWriter(writer); 
    control.RenderControl(html); 

    //write the output 
    HttpContext.Current.Response.Write(writer.ToString()); 

    //and cleanup the writers 
    html.Dispose(); 
    writer.Dispose(); 
} 

} 

//then used like... 
<% int[] numbers = { 1, 2, 3, 4, 5 }; %> 
<% this.Html.RenderControl(new DataGrid() { DataSource = numbers }); %> 

只是一個有趣的概念,你可能會感興趣的。

2

短黑客Web表單控件到你的MVC應用程序中,有許多方法servercontrols不映射到MVC。

它們被部分和控制器(或子控制器,如果你喜歡那種東西)所取代。

如果你只想根據幾個參數來渲染一些HTML,那麼Helper就是你所追求的。靜態類,靜態方法。但是,如果你需要保持狀態,做一堆有狀態的事情,那麼部分的JS和控制器(或子控制器)就是你真正想要的。

管理自己狀態的服務器控件在MVC中確實是過去的事情。

請記住,MVC是一種嘗試使用網絡的方式,特別是如果您將REST引入圖片。 Webforms是一種讓網絡像Windows窗體一樣工作的軟件。