【问题标题】:OpenRasta Framework for component (or composite) based web application基于组件(或复合)的 Web 应用程序的 OpenRasta 框架
【发布时间】:2011-08-15 15:20:28
【问题描述】:

我们正在尝试构建一个更松散耦合的基于复合的 Web 应用程序,并研究各种选项和框架。

这个想法就像当用户浏览到一个页面时,将在服务器上解析 uri 以获取资源和基于配置要采取的操作列表。

视图将由一些 html 标记和一些基于其内容的其他 URI 的组件组成。组件是可重用的,彼此之间不应该有任何想法(可能是上下文)。

这只是一个想法,想看看 OpenRasta 框架如何帮助解决这个问题。我的方法可能完全错误;也许这可以用当前的 asp.net webform 和 mvc 框架轻松完成,但我想看看你的意见。

【问题讨论】:

    标签: components composite openrasta


    【解决方案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; }
    }
    

    因此,每个版本的介绍控件都使用客户端特定的功能扩展视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2012-09-14
      • 2015-07-12
      • 2011-06-07
      • 2020-06-30
      相关资源
      最近更新 更多