2011-10-28 19 views
13

Próbuję zaimplementować stronę maszynki Razor _Layout.cshtml MVC, która używa formantu użytkownika ascx WebForm (non-MVC). Robię to opiera się na „tak” w tym artykule Scott Hansleman „Mixing Razor widoków i WebForms Mistrz stron z ASP.NET MVC 3” http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspxUżyj dotychczasowej kontroli użytkownika ASCX programu ASP.NET w widoku Razor myszy MVC

artykuł mówi, jak korzystać z tego samego ascx kontroli użytkownika zarówno w webform Site.Master page oraz strona MVC Razor _Layout.

Z tego, co przeczytałem: elsewhere on Stackoverflow, można korzystać ze starszych kontrolek użytkownika ascx (a także kontrolek serwera sieciowego ASP.NET) na stronach MVC. Stosując następujący wiersz powinien oddać kontrolę ascx użytkownika w moim Razor _Layout:

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

jednak, że wyrzuca błąd:

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

Próbowałem również poniżej z podobnych wyników:

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

Czego mi tu brakuje?

Odpowiedz

3

Nie można używać klasycznych kontrolek ASP.Net (w/postbacks i ViewState) w ASP.Net MVC.

Html.Partial Umożliwia tylko renderowanie częściowe, które używają tego samego rozszerzenia, ale nie są takie same.

+3

Lekko wprowadzające w błąd, tak długo jak aktualizujesz UX do dziedziczenia ViewUserControl, wszystko jest w porządku ... http: //stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-rendera-a- Legacy-ascx –

+4

@BobTodd: Przez "klasyczne ASP.Net usercontrols", mam tu na myśli postbacks i ViewState, które nie będą działać. – SLaks

15

Jak informuje komunikat o błędzie, kontrola użytkownika "musi pochodzić z ... ViewUserControl". W kodzie za pliku dla użytkownika kontroli, po prostu zmienić ...

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

... do tego:

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

ViewUserControl dziedziczy UserControl, więc będzie nadal pracować w istniejącej Strony WebForms.

Możliwe, że będziesz musiał poradzić sobie z dodatkowymi problemami wykraczającymi poza ten, aby uzyskać kontrolę nad użytkownikami w MVC. Co najmniej jeden inny, że natknąłem się (wspomniał o SLaks):

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

Jeśli wystąpią takie rzeczy, będziesz musiał ruszyć. Zmodyfikuj kontrolę użytkownika, aby mógł on żyć szczęśliwie zarówno w WebForms, jak iw MVC (wymień obraźliwe elementy sterujące na ogólne odpowiedniki HTML - ze wszystkimi tego konsekwencjami) lub duplikuj je, aby mieć wersję WebForms i wersję MVC.

Na przykład będziesz musiał zastąpić rzeczy takie jak <asp:TextBox ID="search"> z <input type="text" name="search" />, co oznacza, że ​​musisz również zmodyfikować kod po stronie serwera, który obsługuje wartość pochodzącą z tego wejścia. Zasadniczo trzeba nijakie sterowanie użytkownika, przekształcenie go z czegoś, co służyło ucieleśnieniu zarówno logiki renderowania widoku, jak i logiki obsługi po obejściu, w coś, co tylko renderuje widok.

Ty może zrobić jeden ascx luz sterowania ładnie z obu WebForms i Razor MVC, a dla prostych rzeczy jak nagłówków i stopek czy tylko do odczytu widoki danych jest to dobre podejście do migracji aplikacji do MVC.Jednak w przypadku bardziej złożonych rzeczy, takich jak formularze wejściowe, łatwiej będzie utrzymać zarówno kontrolę użytkownika, jak i widok maszynki Razer MVC.

8

można użyć formantu użytkownika asp.net w MVC przez następujący sposób

1st dziedziczenie kontroli użytkownika, jak to zmienić domyślnie

domyślnie:

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

zmiana:

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

Druga kontrola użytkownika z kontrolkami asp.net, takimi jak ta w tagu formularza i scr IPT menedżer powinien zadzwonić

<%@ 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> 

3rd użytkownikowi kontrolę połączeń w MVC Zobacz jako

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

powinno działać bez problemu, i to będzie korzystne przekonwertować stare internetowej asp.net w MVC, jeśli stara strona internetowa ma kontrolę użytkowników, tak łatwa do uaktualnienia dzięki nowej technologii w MVC.

+0

to najlepsze rozwiązanie przy korzystaniu z asp.net userconrol z MVC. –