Я только что закончил сайт OpenRasta, который опирается на стандартные веб-элементы управления, которые я внедряю в свои представления, передавая строго типизированный ресурс (предоставляемый OR через обработчик), чтобы включить элемент управления для свойств поверхностного ресурса и т. Д. Обычным способом.
Экземпляр ресурса содержит путь к элементу управления, который должен быть загружен и введен (Resource.ControlPath). Это устанавливается в обработчике путем объединения аспектов URI для поиска элемента управления. Это позволяет различным URI запрашивать разные версии одного и того же элемента управления, которые находятся в разных местах в иерархии файлов сайта.
Так, например, для ClientA требуется представление с множеством специфических для клиента текстов и функций. ClientB также требуется вводная страница с различным содержанием и функциями.
Это дает два URI
- / myapp / clienta / intro
- / MyApp / clientb / интро
Конфигурация
ResourceSpace.Has.ResourcesOfType<IntroResource>()
.AtUri("/myapp/{client}/intro")
.HandledBy<IntroHandler>()
.RenderedByAspx("~/Views/IntroView.aspx");
IntroHandler.cs
public class IntroHandler
{
public OperationResult Get(string client)
{
var controlPath = ClientService.GetIntroControlPath(client);
if (controlPath.IsEmpty()) return new OperationResult.NotFound();
return new OperationResult.OK{
ResponseResource = new IntroResource{
ControlPath = controlPath,
Client=client
}
};
}
}
}
Intro.aspx
<%@ Page Language="C#" Inherits="OpenRasta.Codecs.WebForms.ResourceView<xx.IntroResource>" MasterPageFile="~/Views/View.Master" %>
<asp:Content ContentPlaceHolderID="head" ID="head" runat="server">
<link href="/assets/CSS/intro.css" rel="stylesheet" type="text/css" />
<%
var userControl = Page.LoadControl(Resource.ControlPath) as UserControl;
if (userControl == null) return;
var property = userControl.GetType().GetProperty("Resource");
if (property == null) return;
property.SetValue(userControl, Resource, null);
IntroContentControlHolder.Controls.Add(userControl);
%>
</asp:Content>
<asp:Content ContentPlaceHolderID="body" ID="content" runat="server">
<asp:placeholder runat="server" id="IntroContentControlHolder"></asp:placeholder>
</asp:Content>
Intro.ascx
<%@ Control CodeBehind="intro.ascx.cs" Language="C#" Inherits="xxxx.intro"%>
<h1>Welcome <%=Resource.Client%></h1>
...Lots more UI stuff
Intro.ascx.cs
public class intro : UserControl
{
public IntroResource Resource { get; set; }
}
Поэтому каждая версия элемента управления введением расширяет представление с помощью специфических для клиента функций.