2011-10-28 45 views
13

Tôi đang cố gắng triển khai trang MVC Razor _Layout.cshtml sử dụng Điều khiển người dùng WebForm ascx (không phải MVC). Tôi đang làm điều này dựa trên phần "Có" của bài viết này của Scott Hansleman "Trộn Razor Views và WebForms Master Pages với ASP.NET MVC 3" http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspxSử dụng điều khiển người dùng ASP.NET ASCX cũ trong chế độ xem MVC Razor

Bài viết nói cách sử dụng cùng một điều khiển người dùng ascx trong cả hai trang web.Masterform cũng như trang MVC Razor _Layout.

Từ những gì tôi đã đọc elsewhere on Stackoverflow có thể sử dụng điều khiển người dùng ascx cũ (cũng như điều khiển máy chủ webform ASP.NET) trong trang MVC. Sử dụng dòng sau nên làm cho sự kiểm soát ascx người dùng trong Razor _Layout tôi:

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

Tuy nhiên, đó ném lỗi:

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

Tôi cũng đã cố gắng dưới đây với kết quả tương tự:

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

Tôi thiếu gì ở đây?

Trả lời

3

Bạn không thể sử dụng các liên kết người dùng ASP.Net cổ điển (w/postbacks và ViewState) trong ASP.Net MVC.

Html.Partial chỉ cho phép bạn hiển thị một phần lượt xem, điều này xảy ra để sử dụng cùng một tiện ích, nhưng không giống nhau.

+3

hơi gây hiểu lầm, miễn là bạn cập nhật UX thành kế thừa ViewUserControl bạn ổn ... http: //stackoverflow.com/questions/6538869/mvc3-razor-is-it-possible-to-render-a- legacy-ascx –

+4

@BobTodd: Theo "usercontrols ASP.Net cổ điển", tôi có nghĩa là postbacks và ViewState, sẽ không hoạt động. – SLaks

15

Khi thông báo lỗi nêu rõ, điều khiển người dùng "phải lấy được từ ... ViewUserControl". Trong đoạn code behind file để kiểm soát người dùng của bạn, chỉ cần thay đổi này ...

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

... như thế này:

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

ViewUserControl thừa hưởng từ UserControl, vì vậy nó sẽ tiếp tục làm việc trong hiện tại của bạn Các trang WebForms.

Bạn có thể phải giải quyết các vấn đề khác ngoài vấn đề này để có quyền kiểm soát người dùng của bạn hoạt động trong MVC. Ít nhất một khác mà tôi gặp phải là (ám chỉ bởi SLaks):

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

Nếu bạn gặp phải những thứ như thế này, bạn sẽ có để có được sáng tạo. Hoặc thay đổi điều khiển người dùng để nó có thể sống hạnh phúc trong cả WebForms và MVC (thay thế các điều khiển vi phạm bằng các HTML tương đương - với tất cả các hàm ý đó), hoặc sao chép nó để bạn có phiên bản WebForms và phiên bản MVC.

Ví dụ: bạn sẽ phải thay thế những thứ như <asp:TextBox ID="search"> với <input type="text" name="search" />, điều đó có nghĩa là bạn cũng cần phải sửa đổi mã phía máy chủ xử lý giá trị đến từ đầu vào đó. Về cơ bản, bạn phải kiểm soát người dùng một cách trung thực, chuyển đổi nó từ thứ gì đó được sử dụng để thể hiện cả logic xem logic hậu xử lý sau, vào thứ gì đó chỉ hiển thị chế độ xem.

Bạn thể làm một ascx kiểm soát chơi độc đáo với cả hai WebForms và Razor MVC, và cho những thứ đơn giản như phần đầu trang và cuối trang hoặc chỉ đọc quan điểm của dữ liệu này là một phương pháp tốt để di chuyển một ứng dụng để MVC.Nhưng đối với những thứ phức tạp hơn như các hình thức đầu vào, có lẽ sẽ dễ dàng hơn để duy trì cả điều khiển người dùng ascx và chế độ xem MVC Razor.

8

bạn có thể sử dụng điều khiển người dùng asp.net trong MVC bằng cách sau

1st điều khiển người dùng thay đổi thừa kế này như theo mặc định

mặc định:

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

thay đổi:

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

Điều khiển người dùng thứ hai bằng các điều khiển asp.net như thẻ này trong thẻ biểu mẫu và scr quản lý ipt nên gọi

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

kiểm soát cuộc gọi sử dụng thứ 3 trong MVC Xem dưới dạng

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

nó nên làm việc mà không cần bất kỳ vấn đề, và nó sẽ có lợi cho chuyển đổi trang web asp.net cũ vào MVC, nếu trang web cũ có điều khiển người dùng, nó rất dễ dàng để nâng cấp với công nghệ mới trong MVC.

+0

đó là giải pháp tốt nhất khi sử dụng asp.net userconrol với MVC. –

Các vấn đề liên quan