3

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

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

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

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

4

1 回答 1

0

我刚刚完成了一个 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; }
}

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

于 2012-03-13T14:45:47.387 回答