基于组件(或复合)的 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

如何在 JSF 2 中以编程方式或动态创建复合组件

部署 JSF 复合组件以供共享使用

元素类型无效:需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:未定义的 React

React 16.3 上下文:期望一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:对象

使用VueJS的Web组件