2013-12-26 2 views
0

Я ищу способ, с помощью которого я могу использовать User Control как встроенный ресурс в моем проекте. Есть ли способ достичь этого или, пожалуйста, предложите другой способ управления функциональностью пользовательского контроля.Сделать UserControl как встроенный ресурс

Пожалуйста, если у вас есть какой-либо пример, это будет лучше.

+0

Вместо этого создайте серверный контроль. См. Http://msdn.microsoft.com/en-us/library/yhzc935f.aspx – Magnus

+0

@Magnus, исходный вопрос касается Asp.Net mvc, а не WebForms, поэтому серверные элементы управления не могут использоваться для объектов ViewUserControl –

+0

@ Сергей Литвинов Я хочу добавить пользовательский контроль только в WebForms.Извините, что вопрос получил теги в категории ASP.net mvc. –

ответ

1

Для реализации Embeded пользовательского элемента управления, вы должны следовать ниже шаги:

Шаг 1. Создать C# "ASP.NET Empty Web Application" в Visual Studio 2010 или Visual Web Developer 2010. Имя его как "CSASPNETAccessResourceInAssembly" , Приложению необходимо создать два проекта: «CASASPNETAccessResourceInAssembly», «CASASPNETAssembly».

Шаг 2. Добавьте пользовательский элемент управления и страницу веб-формы в проект «CASASPNETAssembly», этот проект является целевым проектом, другой проект получит доступ к этим ресурсам. Чтобы сделать разницу с другими страницами или пользовательскими элементами управления, нам нужно добавить с ними текст и специальную границу цвета.

Шаг 3. Добавьте папку с веб-страницами и пользовательскими элементами управления в проект CSASPNETAccessResourceInAssembly , как и шаг 2, нам также необходимо добавить текст и границы. Затем нам нужно добавить главную страницу для отображения ресурсов всех проектов, добавить страницу веб-формы и называть ее как «Default.aspx», а также загружать пользовательские элементы управления и ссылки в код за файлом. Для обычных веб-страниц и пользовательских элементов управления мы можем добавить относительный путь напрямую, но для ресурсов других сборок нам нужно добавить некоторую специальную информацию, чтобы объединить небольшую сложную строку url. Следующий код используется для добавления пользовательских элементов управления и ссылок на странице Default.aspx.

public partial class Default : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
    // Add relative web pages and user controls in assembly and this application. 
    DataTable tab = this.InitializeDataTable(); 
    if (tab != null && tab.Rows.Count != 0) 
    { 
     for (int i = 0; i < tab.Rows.Count; i++) 
     { 
      Control control = Page.LoadControl(tab.Rows[i]["UserControlUrl"].ToString()); 
      UserControl usercontrol = control as UserControl; 
      Page.Controls.Add(usercontrol); 
      HyperLink link = new HyperLink(); 
      link.NavigateUrl = tab.Rows[i]["WebPageUrl"].ToString(); 
      link.Text = tab.Rows[i]["WebPageText"].ToString(); 
      Page.Controls.Add(link); 
     } 
    } 
} 


/// <summary> 
/// Initialize a DataTable variable for storing URL and text properties. 
/// </summary> 
/// <returns></returns> 
protected DataTable InitializeDataTable() 
{ 
    DataTable tab = new DataTable(); 
    DataColumn userControlUrl = new DataColumn("UserControlUrl",Type.GetType("System.String")); 
    tab.Columns.Add(userControlUrl); 
    DataColumn webPageUrl = new DataColumn("WebPageUrl", Type.GetType("System.String")); 
    tab.Columns.Add(webPageUrl); 
    DataColumn webPageText = new DataColumn("WebPageText", Type.GetType("System.String")); 
    tab.Columns.Add(webPageText); 
    DataRow dr = tab.NewRow(); 
    dr["UserControlUrl"] = "~/Assembly/CSASPNETAssembly.dll/CSASPNETAssembly.WebUserControl.ascx"; 
    dr["WebPageUrl"] = "~/Assembly/CSASPNETAssembly.dll/CSASPNETAssembly.WebPage.aspx"; 
    dr["WebPageText"] = "Assembly/WebPage"; 
    DataRow drWebSite = tab.NewRow(); 
    drWebSite["UserControlUrl"] = "~/WebSite/WebUserControl.ascx"; 
    drWebSite["WebPageUrl"] = "~/WebSite/WebPage.aspx"; 
    drWebSite["WebPageText"] = "WebSite/WebPage"; 
    tab.Rows.Add(dr); 
    tab.Rows.Add(drWebSite); 
    return tab; 
} 
} 

Шаг 4. Все в порядке, теперь мы можем начать создавать пользовательскую виртуальную файловую систему. На первом этапе создайте класс для наследования класса VirtualPathProvider и переопределите некоторые необходимые методы, такие как FileExists, GetFile, GetCacheDependency, этот класс используется для приема и анализа сообщения, которое может получить правильные ресурсы в веб-запросе.

Следующий код является пользовательским классом поставщика виртуальных путей, который может различать папку «Сборка/xxx».

public class CustomPathProvider : VirtualPathProvider 
{ 
    public CustomPathProvider() 
    { 
    } 


    /// <summary> 
    /// Make a judgment that application find path contains specifical folder name. 
    /// </summary> 
    /// <param name="path"></param> 
    /// <returns></returns> 
    private bool AssemblyPathExist(string path) 
    { 
     string relateivePath = VirtualPathUtility.ToAppRelative(path); 
     return relateivePath.StartsWith("~/Assembly/", StringComparison.InvariantCultureIgnoreCase); 
    } 


    /// <summary> 
    /// If we can find this virtual path, return true. 
    /// </summary> 
    /// <param name="virtualPath"></param> 
    /// <returns></returns> 
    public override bool FileExists(string virtualPath) 
    { 
     if (this.AssemblyPathExist(virtualPath)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.FileExists(virtualPath); 
     } 
    } 


    /// <summary> 
    /// Use custom VirtualFile class to load assembly resources. 
    /// </summary> 
    /// <param name="virtualPath"></param> 
    /// <returns></returns> 
    public override VirtualFile GetFile(string virtualPath) 
    { 
     if (AssemblyPathExist(virtualPath)) 
     { 
      return new CustomFile(virtualPath); 
     } 
     else 
     { 
      return base.GetFile(virtualPath); 
     } 
    } 


    /// <summary> 
    /// Return null when application use virtual file path. 
    /// </summary> 
    /// <param name="virtualPath"></param> 
    /// <param name="virtualPathDependencies"></param> 
    /// <param name="utcStart"></param> 
    /// <returns></returns> 
    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (AssemblyPathExist(virtualPath)) 
     { 
      return null; 
     } 
     else 
     { 
      return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
     } 
    } 
} 

Шаг 5. Затем мы можем создать виртуальный класс файла, получить путь от виртуального пути обеспечения класса и проверить URL-адрес доступен или нет, и возвращает относительный поток assemblys файла. Следующий код показывает, как проверить полезную информацию url s и получить поток ресурсов.

public class CustomFile: VirtualFile 
{ 
    string path 
    { 
     get; 
     set; 
    } 


    public CustomFile(string virtualPath) 
     : base(virtualPath) 
    { 
     path = VirtualPathUtility.ToAppRelative(virtualPath); 
    } 


    /// <summary> 
    /// Override Open method to load resource files of assembly. 
    /// </summary> 
    /// <returns></returns> 
    public override System.IO.Stream Open() 
    { 
     string[] strs = path.Split('/'); 
     string name = strs[2]; 
     string resourceName = strs[3]; 
     name = Path.Combine(HttpRuntime.BinDirectory, name); 
     Assembly assembly = Assembly.LoadFile(name); 
     if (assembly != null) 
     { 
      Stream s = assembly.GetManifestResourceStream(resourceName); 
      return s; 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 

Шаг 6. Наконец, вам нужно только зарегистрировать класс CustomPathProvider к событию Application_Start. Поставщик начинает работать, когда вы пытаетесь запустить это приложение.

Следующий код используется для регистрации пользовательского класса поставщика маршрутов для события Application_Start.

using System.Web.Hosting; 
protected void Application_Start(object sender, EventArgs e) 
{ 
    HostingEnvironment.RegisterVirtualPathProvider(new CustomPathProvider()); 
} 

Шаг 7. Построить приложение, и вы можете отлаживать его.

+0

привет, я использовал выше код, он работает хорошо, но когда я опубликовал этот проект и загрузился в iis, после запуска приложения iis не смог найти веб-пользовательский контроль. –

Смежные вопросы