基于组件(或复合)的 Web 应用程序的 OpenRasta 框架
Posted
技术标签:
【中文标题】基于组件(或复合)的 Web 应用程序的 OpenRasta 框架【英文标题】:OpenRasta Framework for component (or composite) based web application 【发布时间】:2011-08-15 15:20:28 【问题描述】:我们正在尝试构建一个更松散耦合的基于复合的 Web 应用程序,并研究各种选项和框架。
这个想法就像当用户浏览到一个页面时,将在服务器上解析 uri 以获取资源和基于配置要采取的操作列表。
视图将由一些 html 标记和一些基于其内容的其他 URI 的组件组成。组件是可重用的,彼此之间不应该有任何想法(可能是上下文)。
这只是一个想法,想看看 OpenRasta 框架如何帮助解决这个问题。我的方法可能完全错误;也许这可以用当前的 asp.net webform 和 mvc 框架轻松完成,但我想看看你的意见。
【问题讨论】:
【参考方案1】:我刚刚完成了一个 OpenRasta 站点,该站点依赖于我注入到视图中的标准 web 控件,传递强类型资源(由 OR 通过处理程序提供)以使控件能够以通常的方式显示资源属性等。
资源实例携带要加载和注入的控件的路径(Resource.ControlPath)。这是通过连接 URI 的各个方面来在处理程序中设置的以查找控件。这允许不同的 URI 请求位于站点文件层次结构中不同位置的同一控件的不同版本。
因此,例如,ClientA 需要一个包含许多特定于客户端的文本和功能的介绍视图。 ClientB 还需要一个包含不同内容和功能的介绍页面。
这给出了两个 URI
/myapp/clienta/intro /myapp/clientb/intro配置
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;
因此,每个版本的介绍控件都使用客户端特定的功能扩展视图。
【讨论】:
以上是关于基于组件(或复合)的 Web 应用程序的 OpenRasta 框架的主要内容,如果未能解决你的问题,请参考以下文章
根据 PF 数据表复合组件中的条件使用 action 或 actionListener
元素类型无效:需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:未定义的 React