列表呈现器 Renderer

在网站配置文件 web.config 下(云平台下的网站开发配置在 C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Config\\machine.config),通过:

<system.web>
...
<pages>
<controls>
<add tagPrefix="erp" namespace="com.etsoo.SmartERP.SiteBase" assembly="com.etsoo.SmartERP"/>
<add tagPrefix="etsoo" namespace="com.etsoo.SmartERP.Website" assembly="com.etsoo.SmartERP"/>
</controls>
<namespaces>
<add namespace="com.etsoo.Utils.Manager" />
</namespaces>
</pages>
</system.web>

定义了 erp 和 etsoo 两个用户控件标签头,其中 etsoo 标签头的用户控件,仅能在网站开发下使用。每一个列表控件,一般都包含一个或者多个容器控件,用以呈现数据。

容器(Container)控件继承顺序

  1. BlankTemplateContainer -> TemplateContainer -> TabTemplateContainer
  2. BlankTemplateContainer -> TabBlankTemplateContainer
  3. TemplateContainer 容器在列表呈现时,通过 Container 调用,具有以下属性和方法:
    int Index - 当前行位置,从0开始。
    int Count - 记录数。
    bool First - 是否为第一条记录。
    bool Last - 是否为最后一条记录。
    string[] ColumnNames - 字段名数组。
    object[] Values - 值数组。
    [index] 或者 [name] - 通过索引或者字段名获取值。
    string FormatDate(int dateIndex, byte? focusDays = null, string format = null) - 格式化日期。
    string FormatDate(DateTime date, byte? focusDays = null, string format = null) - 格式化日期。
    string FormatFocus(int dateFieldIndex, string focus, int days = 5) - 格式化多少天内的焦点信息。
    string FormatFocus(string dateField, string focus, int days = 5) - 格式化多少天内的焦点信息。
    string FormatMoney(string moneyField, string format = "N2") - 格式化金额。
    string FormatMoney(int moneyFieldIndex, string format = "N2") - 格式化金额。
    string FormatMoney(decimal? moneyValue, string format = "N2") - 格式化金额。
    string FormatQty(decimal? qty) - 格式化数量。
    string FormatQty(string qtyField) - 格式化数量。
    string FormatAddress(int? countryIdIndex, int? regionIndex, int? subregionIndex, int? cityIndex, int? districtIndex, int? streetIndex, int? housenameIndex, int? postcodeIndex, bool? reversed = null) - 格式化地址。
    ContactAddress CreateAddress(string flagPart = null, string referencePart = null) - 创建地址对象。
    string ToBrief(int contentIndex, int maxChars) - 生成省略号内容。
    int GetIndex(string field) - 获取字段名对应的索引位置。
    string Get(int index) - 通过索引获取文本值。
    T Get<T>(int index, T defaultValue) where T : struct - 通过索引获取泛型值。
    string Get(string field) - 通过字段名获取文本值。
    T Get<T>(string field, T defaultValue) where T : struct - 通过字段名获取泛型值。
    Nullable<T> Get<T>(string field) where T : struct - 获取泛型值。
    string JoinTwoParts(int part1Index, int part2Index) - 组合两个字符串为 part1 (part2) 的形式,如果其中有空字符串,则自动调整位置。
    XmlCollectionField ParseXmlField(int index) - 解析XML数据字段。
    XmlCollectionField ParseXmlField(string xml) - 解析XML数据。
    string ParseCategoryName(string categories, int index, string defaultName = null) - 解析类目字符串 网站 -&gt; 关于我们,读取指定层次名称。
    string FormatAsJson() - 输出为JSON字符串。
    string IIF(string boolField, string trueValue, string falseValue) - 条件输出。
    string IIF1(string boolField, decimal minumumValue, string trueValue, string falseValue) - 数字条件输出。

多个控件继承顺序

  1. 接口 IFollowRenderer -> IListRenderer -> IMatchListRenderer
  2. IFollowRenderer (WebControl) -> FollowRenderer (扩展到ListPagesRenderer) -> ListRenderer -> a. MatchListRenderer (扩展到 MergeListRenderer); b. DoubleListRenderer; c. ConfigListRenderer; d. MenuPartRenderer; e. ProductListRenderer; f. TwoListRenderer
  3. IMenuPartRenderer (ListRenderer) -> MenuPartRenderer

列表控件属性:

  1. AutoIdField: 查询参数自动附加当前登录用户编号的字段名,比如需要把当前登录的用户编号,传递给存储过程参数 user_id,则设置为 user_id。
  2. AutoLanguageId: 是否自动传递语言编号。
  3. AutoQueries: 自动附加URL传递的参数到存储过程,比如URL中传递了一个id参数,需要传给存储过程,存储过程中的参数名是 target_id,则设置为 id=target_id,如果两边参数名一样,传递 id 即可。
  4. Delayed: 是否延迟解析,一般控件会自动指定。TwoListRenderer 支持手工设置,默认为延迟解析,如果不是延迟解析,需要手工设置为false。
  5. HasLogDetail: 是否传递日志细节,如果列表控件不指定,则根据参数 Procedure 存储过程名称中是否含有 search 关键字则传递,否则不传递。
  6. ListCount: 列表显示的记录数,通过 Parameters 参数传递 e_max_per_page 的值一致。
  7. Parameters: 传递给存储过程的参数,字符串格式为:a=1&b=2。
  8. Procedure: 读取数据的存储过程。

erp 标签头包含的控件

  1. FollowRenderer: 仅接收数据的呈现器,比如加入的一个 ListRenderer 的存储过程返回三个数据集,可以在紧随其后放置两个 FollowRenderer 来呈现数据。通过 ItemTemplate, HeadTemplate, BottomTemplate, BlankTemplate来呈现数据,通过控件方法 GetData 读取列表数据。
  2. .ListPagesRenderer: 列表分页数据的呈现器。
  3. MenuPartRenderer: 菜单部分呈现器,必须出现在菜单输出前,在网站后台配置栏目编号 mp:test ,然后设置该控件 id 为 test,程序加载的时候,如果读取该栏目,会关联该控件,自动合并控件下的数据为菜单项:
    <erp:MenuPartRenderer runat="server" Procedure="ep_product_search" id="test" ScriptFile="product.aspx" Parameters="fields=p.id, p.name,ex.ex_terms&category_id=4&e_max_per_page=0&ex_location=2&e_order_by=CASE WHEN ex.ex_terms=4 THEN 1 ELSE 0 END DESC" />
  4. ListRenderer: 最常见的列表数据呈现器。
  5. MatchListRenderer : 匹配列表呈现器,通过关联一个列表控件(MatchTo属性指定),配置要匹配的数据(MatchField指定要读取的字段),匹配的参数类型(MatchString属性指定,逻辑型,默认为空,设置为false,会强制转化为数字),写入自己的查询条件(QueryField指定参数名称)来呈现数据,如:<erp:MatchListRenderer runat="server" Procedure="ep_logo_search6" id="CustomerLogo" MatchTo="CustomerGroup" MatchField="id" MatchAll="true" QueryField="target_id" Parameters="fields=cl.id,cl.url">
  6. MergeListRenderer: 合并列表呈现器,与 MatchListRenderer 的差异是默认匹配所有项目,默认匹配字段为id。
  7. DoubleListRenderer: 支持定义 RepeatTemplate 来重复使用列表数据的呈现器,就是一个数据表格,显示两次。
  8. ConfigListRenderer: 配置节点列表数据呈现器,通过传递以分号隔开的配置项目编号,读取配置。请参阅数据库存储过程 ep_get_configurations,如:<erp:ConfigListRenderer runat="server" id="ConfigList" Fields="p:3;4;9,pl:3,pl:4,pl:9" Condition="8"></erp:ConfigListRenderer>
  9. TwoListRenderer: 显示两个表格数据,第一个表格通过 ItemTemplate 来呈现,第二个表格通过 ListTemplate 来呈现。第一个表格的每一行数据,通过字段 IdField (默认为 id),读取第二个表格匹配的数据,字段名通过 ConnectField 定义。
  10. MenuPartRenderer: 菜单部分呈现器,在网站后台配置栏目编号 mp:test ,然后设置该控件 id 为 test,程序加载的时候,如果读取该栏目,会关联该控件,自动合并控件下的数据为菜单项,如:<erp:MenuPartRenderer runat="server" Procedure="ep_product_search" id="test" ScriptFile="product.aspx" Parameters="fields=p.id, p.name,ex.ex_terms&category_id=4&e_max_per_page=0&ex_location=2&e_order_by=CASE WHEN ex.ex_terms=4 THEN 1 ELSE 0 END DESC" />
  11. ProductListRenderer: 产品列表呈现器。

etsoo 标签头包含的控件

  1. TabListRenderer: 栏目文章列表呈现器
  2. TabsListRenderer: 继承自 DoubleListRenderer,所有子栏目文章的列表呈现器,支持 TabHeadTemplate, ItemTemplate, TabBottomTemplate来定义列表数据。