MonoRail学习笔记十九:可重复使用组件ViewComponents的使用

简介:
在MonoRail中我们可以定义一些可重用的组件,在其他需要使用的页面引入这个组件就可以了。有点相当于.NET中的自定义控件,可以节约代码,方便开发,提高重用性。

在MonoRail中把这一功能叫做ViewComponent,下面就来具体看看它的使用方法:
ViewComponent可以使用现成的view,可以给父view发送数据,也支持参数输入和内部多节的方式

1、生成ViewComponent类:
要生成自己的ViewComponet必须从抽象类ViewComponent继承,继承后有三个方法可以被覆盖:
Initialize:初始化,可以在这个方法中接收传递的参数
Render:渲染实际的显示内容
SupportsSection:指定这个组件可以支持哪些子节点

最简单的一个ViewComponent:
using  Castle.MonoRail.Framework;

public   class  HeaderComponent : ViewComponent
{
}
当使用这个组件时会直接渲染views下的 components/headercomponent/default.vm 文件
当然和Controller一样,我们也可以指定一个渲染的vm文件:
using  Castle.MonoRail.Framework;

public   class  HeaderComponent : ViewComponent
{
    
public override void Render()
    
{
        RenderView(
"otherview");
    }

}
这样的话就会使用views下的 components/headercomponent/otherview.vm文件

2、使用ViewComponent组件
生成组件之后,接下来就要看看如何使用它。主要的使用方式有两种:普通方式和嵌套内容的方式,使用时都是直接把类名作为组件名称来使用的
a、普通方式:
#component(HeaderComponent)
使用component关键字来使用
b、嵌套内容的方式:
C#代码:
     public   class  BlockViewComponent2 : ViewComponent
    
{
        
public BlockViewComponent2()
        
{
        }


        
public override void Render()
        
{
            Context.ContextVars[
"it"= "GSpring";
            Context.RenderBody();
        }

    }
vm代码:
#blockcomponent(BlockViewComponent2)
inner content $it
#end
调用之后,显示在页面上的内容就是:
inner content GSpring
嵌套方式主要就是使用关键字:blockcomponent
Context.RenderBody()方法是用来渲染内容的,可以同时调用多次,那么所包含的内容就会显示多次

3、使用参数
正如.NET的自定义控件一样,MonoRail中的自定义控件也可以从外部接收一些参数,比如显示的颜色、大小、其他参数等。
使用ComponentParams属性在Initialize方法中来接收:
using  Castle.MonoRail.Framework;

public   class  TableComponent : ViewComponent
{
    
private ICollection elements;
    
    
private object border;
    
private string style;
    
private object cellpadding;
    
private object cellspacing;

    
public override void Initialize()
    
{
        elements 
= (ICollection) ComponentParams["elements"];
        
        border 
= ComponentParams["border"];
        style 
= (String) ComponentParams["style"];
        cellpadding 
= ComponentParams["cellpadding"];
        cellspacing 
= ComponentParams["cellspacing"];
        
        
base.Initialize();
    }

调用的时候,就可以写成这样:
#blockcomponent(TableComponent with "elements=$items" "border=0" "style=border: 1px solid black;" "cellpadding=0" "cellspacing=2")

#end
或:
#component(TableComponent with "elements=$items" "border=0" "style=border: 1px solid black;" "cellpadding=0" "cellspacing=2")

4、嵌套子节点的使用
在ViewComponet中还可以定义多个子节点,在一些复杂的情况下比较方便,看下面的一个实例:
Contoller代码:
         public   void  Default()
        
{
            ArrayList items 
= new ArrayList();

            items.Add(
"项目1");
            items.Add(
"项目2");
            items.Add(
"项目3");

            PropertyBag.Add(
"items", items);
        }
ViewCompoent代码:
     public   class  TableComponent : ViewComponent
    
{
        
private ICollection elements;

        
private object border;
        
private string style;
        
private object cellpadding;
        
private object cellspacing;

        
public override void Initialize()
        
{
            elements 
= (ICollection)ComponentParams["elements"];

            border 
= ComponentParams["border"];
            style 
= (String)ComponentParams["style"];
            cellpadding 
= ComponentParams["cellpadding"];
            cellspacing 
= ComponentParams["cellspacing"];

            
base.Initialize();
        }


        
public override void Render()
        
{
            RenderText(
                String.Format(
"<table border=\"{0}\" style=\"{1}\" cellpadding=\"{2}\" cellspacing=\"{3}\">",
                              border, style, cellpadding, cellspacing));

            
if (Context.HasSection("colheaders"))
            
{
                Context.RenderSection(
"colheaders");
            }


            
if (elements != null)
            
{
                
int index = 0;

                
foreach (object item in elements)
                
{
                    PropertyBag[
"index"= ++index;
                    PropertyBag[
"item"= item;

                    
if (Context.HasSection("altitem"&& index % 2 != 0)
                    
{
                        Context.RenderSection(
"altitem");
                    }

                    
else
                    
{
                        Context.RenderSection(
"item");
                    }

                }

            }


            RenderText(
"</table>");
        }


        
public override bool SupportsSection(string name)
        
{
            
return name == "colheaders" || name == "item" || name == "altitem";
        }


    }
vm代码:
#blockcomponent(TableComponent with "elements=$items")
#colheaders
< tr >
    
< th > &nbsp; </ th >
    
< th > Element </ th >
</ tr >
#end

#item
< tr >
    
< td > $index </ td >
    
< td > $item </ td >
</ tr >
#end

#altitem
< tr >
    
< td  style ="background-color:Red" > $index </ td >
    
< td  style ="background-color:Red" > $item </ td >
</ tr >
#end
#end

显示的效果,如下图所示:



   本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2007/11/21/966670.html,如需转载请自行联系原作者


相关文章
|
10月前
|
设计模式 Java
Java设计模式【二十二】:空对象模式
Java设计模式【二十二】:空对象模式
69 0
|
7月前
|
前端开发 开发者 设计模式
揭秘Uno Platform状态管理之道:INotifyPropertyChanged、依赖注入、MVVM大对决,帮你找到最佳策略!
【8月更文挑战第31天】本文对比分析了 Uno Platform 中的关键状态管理策略,包括内置的 INotifyPropertyChanged、依赖注入及 MVVM 框架。INotifyPropertyChanged 方案简单易用,适合小型项目;依赖注入则更灵活,支持状态共享与持久化,适用于复杂场景;MVVM 框架通过分离视图、视图模型和模型,使状态管理更清晰,适合大型项目。开发者可根据项目需求和技术栈选择合适的状态管理方案,以实现高效管理。
69 0
|
8月前
|
Python
惊呆了!学会这一招,你的Python上下文管理器也能玩出花样来文管理器也能玩出花样来
【7月更文挑战第6天】Python的上下文管理器是资源优雅管理的关键,与with语句结合,确保资源获取和释放。通过实现`__enter__`和`__exit__`,不仅能做资源分配和释放,还能扩展实现如计时、自动重试、事务处理等功能。例如,TimerContextManager类记录代码执行时间,展示了上下文管理器的灵活性。学习和利用这一机制能提升代码质量,增强功能,是Python编程的必备技巧。
45 0
|
设计模式 前端开发 JavaScript
|
设计模式 JavaScript 前端开发
|
图形学
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
零基础学习Unity常用什么周期函数,超级详细的解析,不看会后悔哦~
6743 0
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
|
设计模式 Java
一起来看引用与现实的邂逅 | 带你学《Java面向对象编程》之二十二
本节通过三则分析为读者介绍了类关联结构、类自身关联等逻辑与合成设计模式的概念,带读者去理解类的灵活性。
一起来看引用与现实的邂逅    | 带你学《Java面向对象编程》之二十二
方圆之内-继承相关限制 | 带你学《Java面向对象编程》之三十八
本节结合案例着重介绍了继承的两个限制,分别为多重继承在Java中不可行,继承类无法直接访问父类私有属性。
|
Web App开发 Android开发
第二十章:异步和文件I/O.(二十三)
回到网上在本章之前,本书中唯一的异步代码涉及使用可移植类库WebRequest中唯一可用于此目的的合理类进行Web访问。 WebRequest类使用称为异步编程模型或APM的旧异步协议。 APM涉及两种方法,在WebRequest的情况下,这些方法称为BeginGetResponse和EndGetResponse。
746 0