Tôi đang tạo Web User Controls
qua mã (đánh dấu viết mã C# của tôi, mã sau và thiết kế tệp trên đĩa trên gọi lại). Các điều khiển được tạo ra tất cả tiền phạt. Tôi có thể thêm chúng vào dự án web của tôi và đặt chúng trên một trang.Đang tải điều khiển ASCX được tạo động (thông qua mã)
Khi tôi cố gắng để tải hiển thị bằng LoadControl(path)
nó nói:
Unable to load type 'MyNameSpace.UseControlClass'
đó là vì kiểm soát chưa được biên dịch.
Nhưng yêu cầu của tôi là tải điều khiển động mà không cần biên dịch lại giải pháp.
Tôi chỉ có thể biên dịch điều khiển người dùng khi tạo tệp kiểm soát? Vì đây có vẻ là lối thoát duy nhất.
EDIT: - Điều tôi đoán là tệp chưa được biên soạn nhưng không được phép tải theo thời gian chạy. Tôi đã cố gắng để biên dịch các tập tin mã bằng cách sử dụng CodeDom
trình biên dịch. Giống như:
var filePath = Server.MapPath(path);
var provider = CSharpCodeProvider.CreateProvider("C#");
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll",
"Telerik.Web.Design.dll", "Telerik.Web.UI.dll",
"Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"});
opts.GenerateExecutable = false;
opts.GenerateInMemory = true;
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" });
Nhưng nó than phiền về cannot find metadata file Telerik.Web.Design.dll
vv Tôi không muốn hardcode đường telerik vì nó có thể khác nhau trong hệ thống lưu trữ (mặc dù nó là trong bin
của ứng dụng web hiện hành). Ngoài ra MyCurrentDll.dll
là dll của tệp mà tôi đang biên dịch tệp mã. Làm cách nào tôi có thể giải quyết vấn đề này?
Ý tưởng của tôi là biên dịch tệp mã tạo dll
động và sao chép tệp đó vào thư mục bin
của ứng dụng web. Nó có thể giải quyết vấn đề ban đầu tôi đã nói.
EDIT 2: - Sau khi nhấn và dùng thử, tôi có thể biên dịch tệp mã động và tạo dll
. Ngay cả sau khi tạo dll và đặt nó vào bin
của ứng dụng của tôi Tôi không thể tải điều khiển người dùng bằng cách sử dụng virtual path
. Tôi đã thử cách tiếp cận sau:
var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);
ctrl được tải sau này. Tôi chỉ định thuộc tính Id
và thêm nó vào điều khiển asp.net Panel
. Nhưng nó không thể nhìn thấy sau khi postback: (
Bây giờ tôi phải thực hiện bằng cách nào đó các loại dll được biên dịch động có sẵn cho thời gian chạy (appdomain, có thể) để khi tôi điều khiển bằng đường dẫn ảo, nó được nạp đúng cách và không nhận được HtmlParseException
hay tìm hiểu xem tại sao tải kiểm soát hình thức Type
không hiển thị
PS: -. tôi đã tải một Label
kiểm soát sử dụng Type
và nó hoạt động đúng
Đó là một câu hỏi thực sự thú vị. Tôi không thể nghĩ về một trường hợp sử dụng cho điều này - nhưng cách tôi thường tiếp cận này là có một hội đồng khác biết làm thế nào để xây dựng điều khiển và phát ra HTML vv tại thời gian chạy. Có lẽ một cách tiếp cận tương tự sẽ có thể ở đây bằng cách nhúng các điều khiển mới của bạn trong một hội đồng khác mà sau đó bạn có thể biên dịch và tải từ? Tôi sẽ xem câu hỏi này với sự quan tâm! – dash
@dash Trường hợp Sử dụng là chúng tôi cho phép người dùng nhóm một số trường (với các loại đầu vào được xác định trước) và nhận dữ liệu nhập từ người dùng cuối. Tôi muốn tạo điều khiển người dùng, nhúng các trường này. – TheVillageIdiot
Các điều khiển và trang lưu trữ của bạn có trong CodeFile thay vì CodeBehind không? – jbl