2011-10-28 73 views
13

我想實現一個使用WebForm ascx用戶控件(非MVC)的MVC Razor _Layout.cshtml頁面。我這樣做是基於這個Scott Hansleman文章「Mixing Razor Views and WebForms Master Pages with ASP.NET MVC 3」中的「Yes」部分。http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx在MVC Razor視圖中使用傳統的ASP.NET ASCX用戶控件

這篇文章說明如何在兩個a中使用相同的ascx用戶控件webform Site.Master頁面以及MVC Razor _Layout頁面。

從我讀的elsewhere on Stackoverflow可以在MVC頁面中使用傳統的ascx用戶控件(以及ASP.NET webform服務器控件)。使用下面的線應該呈現在我的剃刀_layout的ASCX用戶控件:

@{ Html.RenderPartial("~/UserControls/WebUserControl1.ascx"); } 

然而,引發錯誤:

The view at '~/UserControls/WebUserControl1.ascx' must derive from ViewPage, 
ViewPage<TModel>, ViewUserControl, or ViewUserControl<TModel>. 

我也有類似的結果嘗試以下:

@Html.Partial("~/UserControls/WebUserControl1.ascx") 

我在這裏錯過了什麼?

回答

3

您不能在ASP.Net MVC中使用傳統的ASP.Net usercontrols(w/postbacks和ViewState)。

Html.Partial只允許您渲染部分視圖,它恰好使用相同的擴展名,但不相同。

+3

有點誤導,只要你更新UX繼承ViewUserControl你沒事吧... http://stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-render-a-傳統-ascx –

+4

@BobTodd:「傳統的ASP.Net用戶控件」,我的意思是回傳和ViewState,這將無法正常工作。 – SLaks

15

如錯誤消息所述,用戶控件「必須從...... ViewUserControl派生」。從UserControl

public partial class WebUserControl1 : ViewUserControl 
{ 
    // ... 
} 

ViewUserControl繼承,因此它會繼續在現有的工作:在隱藏文件的用戶控件的代碼,只是改變了...

public partial class WebUserControl1 : UserControl 
{ 
    // ... 
} 

...這個WebForms頁面。

不過,爲了讓您的用戶控件在MVC中工作,您可能需要處理超出此範圍的其他問題。至少一個其他我遇到的是(通過SLaks提到):

Control 'controlId' of type 'controlType' must be placed inside a form tag with runat=server.

如果你遇到這樣的東西,你將不得不發揮創造性。要麼修改用戶控件,以便它可以在WebForms和MVC中愉快地生活(用通用HTML等效替換違規控件 - 具有所有這些含義),或者複製它,以便您擁有WebForms版本和MVC版本。

例如,您將不得不將<asp:TextBox ID="search">替換爲<input type="text" name="search" />,這意味着您還需要修改處理來自該輸入的值的服務器端代碼。基本上,你必須將用戶控件中性化,將其從用於體現視圖渲染邏輯後處理邏輯的東西轉換成只呈現視圖的東西。

可以使一個ascx控制既WebForms和MVC剃刀很好的發揮,像頁眉和頁腳或只讀視圖數據的簡單的事情,這是遷移應用程序MVC一個不錯的辦法。但對於輸入表單等更復雜的事情,維護用戶控件和MVC Razor視圖可能會更容易。

8

您可以通過MVC以下方式默認使用asp.net用戶控件

第一變化的用戶控件繼承這個作爲

默認:

public partial class TestControl: UserControl 
{ 
// ... 
} 

變化:

public partial class TestControl: ViewUserControl 
{ 
// ... 
}` 

第二個用戶控件使用asp.net控件,像這樣在form標籤和scr中IPT經理應該在MVC查看通話

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="TestApp.UserControls.TestControl" %> 

<div> 
<h1>Welcome Test User Control</h1> 
<form id="test" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:TextBox runat="server" ID="txtbxTest" Text="Hello"> 

</asp:TextBox> 
</form> 
</div> 

第三個呼叫的用戶控件作爲

@{ Html.RenderPartial("~/UserControls/TestControl.ascx"); } 

它應該沒有任何問題,這將有利於老asp.net網站轉換成MVC,如果舊網站擁有用戶控件,使用MVC中的新技術很容易升級。

+0

這是使用MVC的asp.net userconrol時的最佳解決方案。 –

相關問題