且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-14 18:18:52

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

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

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

最简单的一个ViewComponent:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用using Castle.MonoRail.Framework;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
public class HeaderComponent : ViewComponent
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用}
当使用这个组件时会直接渲染views下的components/headercomponent/default.vm文件
当然和Controller一样,我们也可以指定一个渲染的vm文件:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用using Castle.MonoRail.Framework;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
public class HeaderComponent : ViewComponent
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
public override void Render()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        RenderView(
"otherview");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用}
这样的话就会使用views下的components/headercomponent/otherview.vm文件

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

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
public override void Render()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            Context.ContextVars[
"it"= "GSpring";
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            Context.RenderBody();
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        }

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

3、使用参数
正如.NET的自定义控件一样,MonoRail中的自定义控件也可以从外部接收一些参数,比如显示的颜色、大小、其他参数等。
使用ComponentParams属性在Initialize方法中来接收:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用using Castle.MonoRail.Framework;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
public class TableComponent : ViewComponent
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
private ICollection elements;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
private object border;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
private string style;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
private object cellpadding;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
private object cellspacing;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
public override void Initialize()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        elements 
= (ICollection) ComponentParams["elements"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        border 
= ComponentParams["border"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        style 
= (String) ComponentParams["style"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        cellpadding 
= ComponentParams["cellpadding"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        cellspacing 
= ComponentParams["cellspacing"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
base.Initialize();
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
调用的时候,就可以写成这样:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#blockcomponent(TableComponent with "elements=$items" "border=0" "style=border: 1px solid black;" "cellpadding=0" "cellspacing=2")
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#end
或:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#component(TableComponent with "elements=$items" "border=0" "style=border: 1px solid black;" "cellpadding=0" "cellspacing=2")

4、嵌套子节点的使用
在ViewComponet中还可以定义多个子节点,在一些复杂的情况下比较方便,看下面的一个实例:
Contoller代码:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        public void Default()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            ArrayList items 
= new ArrayList();
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            items.Add(
"项目1");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            items.Add(
"项目2");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            items.Add(
"项目3");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            PropertyBag.Add(
"items", items);
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        }
ViewCompoent代码:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    public class TableComponent : ViewComponent
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
private ICollection elements;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
private object border;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
private string style;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
private object cellpadding;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
private object cellspacing;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
public override void Initialize()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            elements 
= (ICollection)ComponentParams["elements"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            border 
= ComponentParams["border"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            style 
= (String)ComponentParams["style"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            cellpadding 
= ComponentParams["cellpadding"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            cellspacing 
= ComponentParams["cellspacing"];
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
base.Initialize();
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
public override void Render()
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            RenderText(
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                String.Format(
"<table border=\"{0}\" style=\"{1}\" cellpadding=\"{2}\" cellspacing=\"{3}\">",
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                              border, style, cellpadding, cellspacing));
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
if (Context.HasSection("colheaders"))
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                Context.RenderSection(
"colheaders");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
if (elements != null)
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                
int index = 0;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                
foreach (object item in elements)
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    PropertyBag[
"index"= ++index;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    PropertyBag[
"item"= item;
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    
if (Context.HasSection("altitem"&& index % 2 != 0)
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                        Context.RenderSection(
"altitem");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    
else
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                        Context.RenderSection(
"item");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用                    }

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

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

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            RenderText(
"</table>");
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
public override bool SupportsSection(string name)
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        
{
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用            
return name == "colheaders" || name == "item" || name == "altitem";
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用        }

MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    }
vm代码:
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#blockcomponent(TableComponent with "elements=$items")
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#colheaders
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
<tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<th>&nbsp;</th>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<th>Element</th>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
</tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#end
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#item
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
<tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<td>$index</td>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<td>$item</td>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
</tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#end
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#altitem
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
<tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<td style="background-color:Red">$index</td>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用    
<td style="background-color:Red">$item</td>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用
</tr>
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#end
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用#end
MonoRail学习笔记十九:可重复使用组件ViewComponents的使用

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

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



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