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
{
publicoverridevoidRender()
{
RenderView(
"otherview");
}

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

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


publicoverridevoidRender()
{
Context.ContextVars[
"it"]="GSpring";
Context.RenderBody();
}

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

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

public class TableComponent:ViewComponent
{
privateICollectionelements;

privateobjectborder;
privatestringstyle;
privateobjectcellpadding;
privateobjectcellspacing;

publicoverridevoidInitialize()
{
elements
=(ICollection)ComponentParams["elements"];

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

base.Initialize();
}

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

#end
或:
#component(TableComponentwith"elements=$items""border=0""style=border:1pxsolidblack;""cellpadding=0""cellspacing=2")

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

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

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

privateobjectborder;
privatestringstyle;
privateobjectcellpadding;
privateobjectcellspacing;

publicoverridevoidInitialize()
{
elements
=(ICollection)ComponentParams["elements"];

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

base.Initialize();
}


publicoverridevoidRender()
{
RenderText(
String.Format(
"<tableborder=\"{0}\"style=\"{1}\"cellpadding=\"{2}\"cellspacing=\"{3}\">",
border,style,cellpadding,cellspacing));

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


if(elements!=null)
{
intindex=0;

foreach(objectiteminelements)
{
PropertyBag[
"index"]=++index;
PropertyBag[
"item"]=item;

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

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

}

}


RenderText(
"</table>");
}


publicoverrideboolSupportsSection(stringname)
{
returnname=="colheaders"||name=="item"||name=="altitem";
}


}
vm代码:
#blockcomponent(TableComponentwith"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.itpob.cn/bbs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值