我刚刚完成了一个 OpenRasta 站点,该站点依赖于我注入到视图中的标准 web 控件,传递强类型资源(由 OR 通过处理程序提供)以使控件能够以通常的方式显示资源属性等。
资源实例携带要加载和注入的控件的路径(Resource.ControlPath)。这是通过连接 URI 的各个方面来在处理程序中设置的以查找控件。这允许不同的 URI 请求位于站点文件层次结构中不同位置的同一控件的不同版本。
因此,例如,ClientA 需要一个包含许多特定于客户端的文本和功能的介绍视图。ClientB 还需要具有不同内容和功能的介绍页面。
这给出了两个 URI
- /myapp/clienta/介绍
- /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
}
};
}
}
}
介绍.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>
介绍.ascx
<%@ Control CodeBehind="intro.ascx.cs" Language="C#" Inherits="xxxx.intro"%>
<h1>Welcome <%=Resource.Client%></h1>
...Lots more UI stuff
介绍.ascx.cs
public class intro : UserControl
{
public IntroResource Resource { get; set; }
}
因此,每个版本的介绍控件都使用客户端特定的功能扩展视图。