2012-01-26 35 views
5

Tôi muốn tạo điều khiển người dùng DerivedUserControl.ascx có nguồn gốc từ điều khiển người dùng khác BaseUserControl.ascx. Điều khiển người dùng cơ bản xuất phát từ System.Web.UI.UserControl theo yêu cầu. Các điều khiển người dùng này được xác định trong các thư mục khác nhau. Bởi vì tôi đang sử dụng một dự án Web Studio 2010 Web Site (tôi không thể chuyển sang dự án ứng dụng Web), các điều khiển người dùng này không được định nghĩa bên trong một không gian tên.Kiểm soát người dùng có nguồn gốc từ lớp cơ sở điều khiển người dùng tùy chỉnh

Vấn đề của tôi là khi tôi cố gắng biên dịch dự án, lớp cơ sở của điều khiển người dùng có thể không được giải quyết (rõ ràng vì trình biên dịch không biết tệp .ascx định nghĩa lớp cơ sở). Có cách nào giải quyết vấn đề này không?

Tôi đã thử mọi thứ tôi có thể tưởng tượng, không thành công. Mọi sự trợ giúp sẽ rất được trân trọng.

BaseUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="BaseUserControl.ascx.cs" Inherits="BaseUserControl" %> 

BaseUserControl.ascx.cs

public partial class BaseUserControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

DerivedUserControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DerivedUserControl.ascx.cs" Inherits="DerivedUserControl" %> 

DerivedUserControl.ascx.cs

public partial class DerivedUserControl : BaseUserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

Lỗi

The type or namespace name 'BaseUserControl' could not be found 

Trả lời

2

Khi sử dụng trang web ASP.NET (như được áp dụng cho một dự án Web), bạn cần thêm phần tử <@Reference> vào DerivedUserControl.ascx của bạn.

Từ MSDN nó ...

Chỉ ra rằng một điều khiển người dùng, trang nguồn tập tin, hoặc tùy ý tập tin nằm ở một số con đường ảo nên được biên dịch tự động và liên kết chống lại các tập tin ASP.NET hiện tại (Trang web, điều khiển người dùng hoặc trang chính) trong đó chỉ thị này được khai báo.

<%@ Reference VirtualPath="~/FolderName1/BaseUserControl.ascx" %>

Một khi bạn đã làm điều đó, bạn có thể tham khảo nó như vậy

public partial class DerivedUserControl : ASP.foldername1.baseusercontrol_ascx 

đâu FolderName1 là thư mục BaseUserControl bạn đang ở trong.

+0

Ồ, những thứ này dường như hoạt động bằng cách sử dụng 'ASP.base_baseusercontrol_ascx'. – CodeZombie

+0

Tôi lấy nó 'base' là tên của thư mục mà BaseUserControl.ascx sống. –

+0

Cảm ơn rất nhiều, bạn thực sự đã cứu ngày của tôi: D – CodeZombie

0

Vấn đề dường như rằng DerivedUserControl.ascx không có quyền truy cập vào các DLL chứa BaseUserControl. Hãy chắc chắn rằng bạn thêm một tham chiếu đến dll và có bản sao local = true.

+0

Tôi sử dụng một dự án trang web vì vậy tôi không nhận được một bộ biên dịch (dll) tôi có thể tham khảo. – CodeZombie

+0

Thử đặt đường dẫn trong Inherits, để nó có thể tìm thấy mã không nằm trong cùng một directoty –

+0

Trong một dự án * WebSite * được tạo động –

0

này không biên dịch:

namespace MyBase 
{ 
    public class BaseUserControl : System.Web.UI.UserControl 
    { } 
} 
public class DerivedUserControl : BaseUserControl 
{ } 

này biên dịch:

namespace MyBase 
{ 
    public class BaseUserControl : System.Web.UI.UserControl 
    { } 
} 
public class DerivedUserControl :MyBase.BaseUserControl 
{ } 

Vì vậy, khá nhiều thêm tên của namespace + chấm + tên của lớp cơ sở của bạn. Chúc may mắn!

+0

Không có không gian tên được thiết lập bằng cách sử dụng dự án trang web theo mặc định. – CodeZombie

1

Tạo một lớp/thường xuyên. cs cho lớp cơ sở của bạn được gọi là BaseUserControl.cs:

public class BaseUserControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 
+0

Đó sẽ là một giải pháp tốt đẹp. Rất tiếc, tôi không thể sửa đổi lớp cơ sở vì nó là một phần của CMS. – CodeZombie

+0

Đó là bản sửa lỗi âm thanh kỹ thuật trong các trường hợp khác nhau. – Patrick

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