MVC框架显示层—使用Monorail点滴(1)

本文介绍如何使用MonoRail框架搭建Web应用,包括安装配置、创建控制器与视图、布局及组件使用方法,还涉及URL映射技术和数据绑定。

本实例使用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")


数据绑定

if (id == 0)
   {
    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中增加映射规则

 < monoRail>
< 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模块

  < system.web>
     < 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规则将描述怎样映射到真正的路径:
看这个例子:

   < pattern>(/blog/posts/)(\d+)/(\d+)/(.)*$< /pattern>
   < 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  

转载于:https://www.cnblogs.com/ccsonline/archive/2007/02/02/638189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值