本实例使用VS2003,实例如下:
1.到官方网站下载安装文件,地址如下:
http://www.castleproject.org/目前最新版本1.0Rc2
2.添加对
Castle.MonoRail.Framework.dll
Castle.MonoRail.Framework.Views.CompositeView.dll
Castle.MonoRail.Framework.Views.NVelocity.dll
NVelocity.dll
的引用。
若你没有下载和安装Castle,在我的实例代码的lib中有这些dll的文件
3.创建一个Web项目,并在其下创建views和controllers目录
4.在controllers目录下创建HomeController.cs,并创建Index方法,代码如下:
using System;
using Castle.MonoRail.Framework;
namespace MonoRailTest.controllers
{
/**//// <summary>
/// HomeController 的摘要说明。
/// </summary>
public class HomeController:Controller
{
public HomeController()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void Index()
{
PropertyBag.Add("name", "MonoRail实例");
}
}
}
5.在Views目录下创建home目录下,并在home目录下创建index.vm文件,代码如下:
显示信息:$name
6.配置web.config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="monoRail" type="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework" />
</configSections>
<!--如果要使用Castle的IOC,则为-->
<!--<monoRail useWindsorIntegration="true"> -->
<monoRail>
<controllers>
<!--定义controller所在的assembly-->
<assembly>MonoRailWeb</assembly>
</controllers>
<viewEngine
viewPathRoot="Views"
customEngine="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity" />
</monoRail>
<system.web>
<httpHandlers>
<!--定义httpHandler, 让MonoRailHttpHandlerFactory接管指定扩展名的url-->
<add verb="*" path="*.rails"
type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" />
<!-- 阻止模板文件被下载 -->
<add verb="*" path="*.vm" type="System.Web.HttpForbiddenHandler" />
</httpHandlers>
</system.web>
</configuration>
7.配置iis,在iis中注册.rails的扩展名,查看 http://goodlyts.cnblogs.com/archive/2005/09/27/244686.html
8.在Views目录下创建nvelocity.properties文件,内容如下:
input.encoding=GB2312
output.encoding=GB2312
这是解决模板中中文乱码的问题
9.现在就可以访问http://localhost:8089/home/index.rails,页面就会出现相应的信息了。
Layouts
我们在作网站的时候,通常有很多的网页都具有相同的页面如 header,footer 等,在 asp.net 中可以使用 MasterPage,
在 MonoRail 中同样具有 MasterPage 相关的功能 , 这里叫 Layouts
Layouts的使用方法如下:
1.在Views目录下创建layouts目录
2.在layouts目录下创建Master.vm文件,代码如下:
<html>
<head>
<title>MonoRail学习</title>
</head>
<body>
实例如下:
<p>$childContent</p>
</body>
</html>
$childContent用来退换具体的内容
3.在HomeController类前加上Layout属性
[Layout("Master")]
public class HomeController:Controller
{
public HomeController()
{
}
public void Index()
{
PropertyBag.Add("name", "MonoRail实例");
}
}
这样所有homecontroller的页面都带有master.vm的模板页面的代码
你也可以为某一个action设置另外一个Layout.
[Layout("ActionMaster")]
public void Index1()
{
PropertyBag.Add("name", "MonoRail实例");
Redirect("Home","index");
}
Component
在我们asp.net中,经常有界面代码相同的时候,使用UserControl,在MonoRail中有两种方式来实现页面的重用,
第一种,只重用view
如下:
#parse("home/newslist.vm")
相当于include这个newslist.vm到指定的页面
第二种就是Component
Component创建如下:
1.创建一组件类NewsList.cs
using System;
using Castle.MonoRail.Framework;
namespace MonoRailWeb.components
{
/**//// <summary>
/// NewsList 的摘要说明。
/// </summary>
public class NewsList : SmartViewComponent
{
public NewsList()
{
}
public override void Render()
{
//将值传输给View
this.Context.ContextVars["name"] = "这是一个新闻组件";
//显示相应的View
this.RenderView("News","NewsList");
}
}
}
2.在views目录下创建components目录,在components目录下在创建news,在news目录下创建newslist.vm文件
<table>
<tr><td>$name</td></tr>
</table>
这是组件的界面部分
3.在页面中调用该组件
#component(NewsList)
这样一个组件就创建完成了。
通常,我们会为组件设定一些参数,这样在我们调用组件的时候在设置参数的值。
那么就需要在组件类中得到参数的值,如下:
//得到参数ID的值
string id = Context.ComponentParameters["id"].ToString();
在页面中设置参数的值
#component(NewsListById with "id=1")
若有多个参数,则如下:
#component(NewsListById with "id=1" "name=test")
数据绑定
{
mark = new BookmarkEntry();
mark.CategoryId = categoryId;
mark.Owner = mark.Creator = SiteContext.Current.User;
mark.CreateDate = DateTime.Now;
mark.CreatorFullName = SiteContext.Current.User.FullName;
mark.CreatorName = SiteContext.Current.User.Name;
BindObjectInstance(mark, ParamStore.Form, "mark");
if(!mark.Url.ToLower().StartsWith(@ "http://"))
{
mark.Url= "http://" + mark.Url;
}
url = PostService.GetBookmarkUrlByUrl(mark.Url);
if( object.Equals(url, null))
{
url = new BookmarkUrl();
url.Url = mark.Url;
PostService.SaveBookmarkUrl(url);
}
mark.BookmarkUrl = url;
url.Referers.Add(mark);
}
else
{
mark = (BookmarkEntry)PostService.GetResource(id);
BindObjectInstance(mark, ParamStore.Form, "mark");
}
在monoRail中使用url映射
在MonoRail中实现url映射很简单阿,三句话就可讲清楚:
1、将相关应用程序配置为对该程序下目录的相关访问都使用aspnet_isapi.dll处理。
此图片仅显示局部,请点击查看完整图片
如果使用 news/2006/07/12/ 这样映射到目录,需要如上将通配符映射到aspnet_isapi.dll,如果指定了扩展名,那么需要将相应的扩展名映射到aspnet_isapi.dll。
注意取消选取“确认文件是否存在”。
2、在web.config中增加映射规则
< routing>
< rule>
< pattern>(/blog/posts/)(\d+)/(\d+)/(.)*$< /pattern>
< replace>< ![CDATA[ /blog/view.rails?year=$2&month=$3 ]]>< /replace>
< /rule>
< rule>
< pattern>(/news/)(\d+)/(\d+)/(.)*$< /pattern>
< replace>< ![CDATA[ /news/view.rails?year=$2&month=$3 ]]>< /replace>
< /rule>
< /routing>
< /monoRail>
3、继续在 <system.web>的 <httpmodules>节增加 routing模块
< httpHandlers>
< add verb= "*" path= "*.rails"
type= "Castle.MonoRail.Engine.MonoRailHttpHandlerFactory, Castle.MonoRail.Engine" />
< /httpHandlers>
< httpModules>
< add name= "routing" type= "Castle.MonoRail.Framework.RoutingModule, Castle.MonoRail.Framework" />
< /httpModules>
< /system.web>
在第二步的routing节中使用证则表达式指定的rule规则将描述怎样映射到真正的路径:
看这个例子:
< replace>< ![CDATA[ /blog/view.rails?year=$2&month=$3 ]]>< /replace>
使用 /blog/posts/2000/11/* 的url都将被映射到/blog/view.rails?year=2000&month=11这一真正的url上。
对了,在monoRail中这一功能就被称作“Routing”,更详细的信息,可以看这个地址:http://www.castleproject.org/index.php/Routing