从留言簿开始,学习MonoRail MVC(一)  
(来自:http://fuyun.cnblogs.com/)

关注MVC开发Web应用程序是看到《一个.NET的MVC Web框架》这篇文章以后开始的,通过官方网站的几个教程很快引起了我的兴趣,的确是非常简洁,让我想起了ASP的时代。再搜索了一下ASP.NET MVC框架,发现MonoRail相对来说文档较多一些,决定从它开始。最近一段时间微软要推出ASP.NET的MVC框架新闻各大技术网站都在转,博客园针对MonoRail的文章也多了起来。使用ASP.NET WebForm开发的经验不是很多,所以学习MonoRail显得更容易一些,没有固有的思维方式限制,这对我是个有利的一面。

准备

学习MonoRail的一些参考资料:

Velocity 《VTL语法参考指南》中文版
MonoRail在View一层提供了多种Render引擎,貌视NVelocity的最多。它语法应该和Velocity是一致的(未考证)。

prototype.js 1.4版开发者手册
如果要使用AJAX技术的话,对这套JS库有所了解对你非常有帮助,MVC模式下可没有Update Panel使用了。

MonoRail中的ajaxHelper入门
看了这篇文章以后才知道AJAX其实和MonoRail MVC框架没多大关系,要想用好AJAX应用还是得了解prototype.js这些库。

先看看博客园两位朋友的文章,入门还要更快一些。
一是Yok 的 MonoRail专栏
二是福娃 的 MonoRail学习-介绍篇

另外MonoRail的官方网站http://www.castleproject.org/是必须要去的。

实战

在官方网站下载安装包安装好以后,就可以使用VS2005开始工作了,具体方法还是参考上面两位朋友的文章吧。
通过两个晚上的摸索,对MonoRail有了大致的了解。通过编写了一个留言簿的实战,明白了如何在MonoRail上实现以下技术和一些细节。
1、三层架构应用
2、AJAX应用
3、Url Rewriting
4、Model、View、Controller分别建立Project,在大中型项目中这是必不可少的。

现在还没有搞清楚的事情和下一步要做的实验:
1、多层目录结构如何与Controller对应;
2、表单验证是否有更方便的实现方式,现在使用prototype.js可以进行验证,不过内容仍然提交到服务器上了。
3、如何进行View嵌套,现在只是通过ShareView的方式共享。
4、View目录中的模板使用的图片、CSS等文件放在那儿合适。现在的问题是放在网站目录下编辑时看不到效果,放到View目录下不利于发布。
5、如何方便的对网站换肤,还有待进一步实验。

希望我能坚持把这次学习过程记录下来。
项目截图:

把这次实践的源码发上来,希望对学习MonoRail的朋友有所帮助。

 * 昨天晚上发布的代码中未包含NVelocity引擎库,现在已经加上。请需要的朋友重新下载。
下载:http://www.cnblogs.com/Files/fuyun/GeustBook.rar

从留言簿开始,学习MonoRail MVC(二)
在研究MonoRail过程中进行了URL重定向的实验。未全面了解MonoRail的情况下,首先尝试使用ASP.NET经典方式,参考Microsoft一篇文章《在ASP.NET 中执行URL 重写》,创建UrlRewriteModule类并实现IHttpModule接口来达到我的要求。在实现该功能的同时,我将URL重定向的配置文件重Web Config中移除来,单独建立了一个URLRewriting.config的文件进行管理。

UrlRewriteModule类工作流程

初始化

public void Init(HttpApplication context)
{
    try
    {
        LoadConfig(HttpRuntime.AppDomainAppPath + "UrlRewriteRule.config");
    }
    catch (Exception ex)
    {
        string message = "加载Url Rewriting 配置文件失败。";
        Debug.WriteLine(message);
        Debug.WriteLine(ex.Message);
        throw;
    }

    context.BeginRequest += new EventHandler(context_BeginRequest);
}

读取配置

private void LoadConfig(string path)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(path);

    if (processors == null)
        processors = new List<UrlRewriteProcessor>();
    else
        processors.Clear();

    string lookFor, sendTo;
    foreach (XmlNode node in doc.SelectNodes("urlRewriting/rules/rule"))
    {
        lookFor = node.SelectSingleNode("lookFor/text()").Value;
        sendTo = node.SelectSingleNode("sendTo/text()").Value;

        if (!String.IsNullOrEmpty(lookFor) && !String.IsNullOrEmpty(sendTo))
            processors.Add(new UrlRewriteProcessor(lookFor, sendTo));
    }
}

通过XmlDocument直接读取XML内容,实际易用中这里必须要对配置文件进行监视,内容改动以后需要重新加载。
配置文件结构

<?xml version="1.0" encoding="utf-8"?>
<urlRewriting>
  <rules>
    <rule>
      <lookFor>/guestbook/(/d+)/delete/.castle</lookFor>
      <sendTo>/guestbook/delete.castle?id=$1</sendTo>
    </rule>
    <rule>
      <lookFor>/guestbook/(/d+)/(/d+)/test.castle</lookFor>
      <sendTo><![CDATA[/guestbook/test.castle?year=$1&month=$2]]></sendTo>
    </rule>
  </rules>
</urlRewriting>

lookFor为需要重定向的源地址格式正则表达式,sendTo为重定向目标地址。这里配置了删除留言的URL重定向。
例如原来删除ID=2的留言记录URL路径为http://localhost/guestbook/delete.castle?id=2。现在可以写成http://localhost/guestbook/2/delete.castle

分析路径进行

private void context_BeginRequest(object sender, EventArgs e)
{
    HttpContext context = HttpContext.Current;

    if (processors != null)
    {
        foreach (UrlRewriteProcessor processor in processors)
        {
            if (processor.Process(context))
                break;
        }
    }
}

浏览器的请求都会经过context_BeginReqeust方法,在这里分析请求的路径。UrlRewriteProcessor读取配置文件中的正则表达式过滤请求的路径,对满足条件的进行重定向。
该方法条用非常频繁,所使用的正则表达式预先编译好,存放在UrlRewriteProcessor类中,UrlRewriteProcessor类实例集合为UrlRewriteModule类的静态成员。

private static List<UrlRewriteProcessor> processors = null;

URL重定向

        public bool Process(HttpContext context)
        {
            if (regex.IsMatch(context.Request.FilePath))
            {
                string newUrl = regex.Replace(context.Request.FilePath, sendTo);
                context.RewritePath(newUrl);
                return true;
            }
            else
            {
                return false;
            }
        }

使用正则表达式对符合条件的URL进行参数替换以后,调用ASP.NET的HttpContext.RewritePath(string url)方法就完成了URL重定向功能。

web.config中进行配置
要使URL重定向生效,还必须将UrlRewriteModule配置到系统中才能行。
在web.config中<system.web/>/<httpModules/>加入以下代码。

<httpModules>
    <add name="urlRewriting" type="Lanjian.GuestBook.UrlRewriteModule, GuestBook" />  <!-- 这儿是为URL重定向而增加的配置 -->
  <add name="monorail" type="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework" />
</httpModules>

注意我们的URL重定向HTTPModule在配置文件中,必须放在monorail之前,否则不能生效。

今天在GSpring 发表的《MonoRail学习笔记三:使用方便功能强大的routing功能》文章中了解到,MonoRail框架中的routing已经实现了该功能。
配置方法可以参考GSpring的文章。

总结

使用MonoRail框架时,URL重定向可以使用你以前习惯的或者是现有的HTTPModule模块进行处理,或者使用MonoRail的routing。参考源代码,二者实现思路是完全一样的。
同时也要注意,URL重定向配置项必须放在monorail之前。

项目截图:

本文的完整代码可以在这儿下载。
<script type=text/javascript> // </script>

从留言簿开始,学习MonoRail MVC(三)
刚开始学习MonoRail的时候,一直搞不清楚URL与调用的Controller是如何对应了,经过一番实验分析后,得出以下结论。

一个http请求是与如何工作的呢?请看以下实例,我们将浏览器发出的请求URL分层四段。

http://localhost/guestbook/user/admin/index.castle

1       2        3      4

第一段“guestbook/user”由Controller的ControllerDetails Attribute决定,设置为Area属性为“guestbook/user”的Controller才有可能会被调用。

第二段“admin”决定系统会调用AdminController类,类的Namespace和大小写与此无关。但是 ControllerDetails的Area属性必须匹配才行。该值的大小写无关。

第三段“index”决定系统会调用GuestBookController的Index公共方法,该值与大小写无关。

第四段“castle”是由web.config配置文件决定的,在<system.web/><httpHandlers/>配置节中,MonoRail需要添加以下配置才能正常工作。其中“path”决定了访问URL的扩展名,这里我们设置的是“*.castle”,你可以修改为你喜欢的名字。不过你想设置在IIS中配置过的名称比如“*.html”,就需要修改IIS配置了。

Web.config <system.web/><httpHandlers/>节中的MonoRail配置项:

<add verb="*" path="*.castle" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" />

GuestBookController类:

[ControllerDetails(Area = "guestbook/user")]
public class AdminController : Controller
{
      public void Index()
      {
      }
}

引申问题,如果请求http://localhost/guestbook/index123.castle这样的路径,由于GuestBookController没有Index123这个方法,当我们调用一个不存在的公共方法时会出现异常。希望通过友好的方式显示错误信息或者重定向到另一个存在的页面时,可以使用[DefaultAction()]来描述GuestBookController类。

[DefaultAction()]
public class GuestBookController : BaseController
{
    public void DefaultAction()
    {
    }
}

http://localhost/guestbook/index123.castle会调用DefaultAction()方法。

或者

[DefaultAction("Index")]
public class GuestBookController : BaseController
{
    public void Index()
    {
    }
}

http://localhost/guestbook/index123.castle会调用Index()方法。

现在还没有解决的问题,调用http://localhost/index.castle这样的URL会出异常。不知道那位朋友知道如何解决,请告知。

经过一番Google,终于找到实现调用http://localhost/index.castle这样的路径的方法了。在web.config monorail配置节中,增加defaultUrls的配置即可。

    <monorail smtpHost="yoursmtphost" useWindsorIntegration="false">
    <defaultUrls>
      <add url="index.castle" controller="guestbook" action="index" area="" />
    </defaultUrls>

如果希望http://localhost/也能正常访问的话,有个简单的办法,在网站根目录下建立一个default.aspx文件。内容如下:

<%@ Page Language="C#" %>
<script runat="server">
  protected override void OnLoad(EventArgs e)
  {
    Response.Redirect("/index.castle");
    base.OnLoad(e);
  }
</script>

学习MonoRail MVC相关推荐

  1. 从留言簿开始,学习MonoRail MVC(三)

    刚开始学习MonoRail的时候,一直搞不清楚URL与调用的Controller是如何对应了,经过一番实验分析后,得出以下结论. 一个http请求是与如何工作的呢?请看以下实例,我们将浏览器发出的请求 ...

  2. ExtJS学习:MVC模式案例(三)

    在ExtJS案例系列教程的前两讲,我们了解了该案例的最终实现效果,并且在ExtJS学习:MVC模式案例(二)中我们添加Viewport.js和demoController.js两个文件,实现了对整个网 ...

  3. MonoRail MVC应用(2)-构建多层结构的应用程序

    习惯了分层结构的.NET开发了,当然也是分层有优势,所以在使用MonoRail进行网站构建时,首先考虑到的问题就是MonoRail如何应对分层的结构. 问题1:MonoRail在WEB层没有根目录,必 ...

  4. spring struts2 mybatis框架学习总结(mvc三层架构)

    spring struts2 mybatis框架学习总结(mvc三层架构) ssi的框架主要是由struts2,spring以及ibatis组成,他们负责各层之间的交互与协作,从而实现整个web端的功 ...

  5. ExtJS4.2学习(9)——MVC

    对于Extjs来说,大客户端程序一直很难写,当你为大客户端程序添加更多的功能和项目的时候,项目的体积往往迅速增长.这样的大客户端程序很难组织和维持 ,所以,Extjs4配备了一个新的应用程序体系结构, ...

  6. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  7. android mvc使用方法,详细学习android mvc设计模式教程

    MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 web 应用程序的模式.其分层有助于管理复杂的应用程序,因为可以在一个时间内专门关注一个方面.例如 ...

  8. 20-spring学习-Spring MVC基本操作

    本次实现数据的CRUD功能,数据依然以VO类形式进行数据接收. 一,建立Message.java类操作,负责数据的接收操作. package com.SpringMVC.vo;public class ...

  9. MonoRail MVC应用(1)-VM/HTML页面

    MVC的一个很重要的优势就是方便组织HTML代码,所以先从这个开始.这里的过程,我最终还是决定采用类似官方DEMO的做法,使用NVelocity.所以Web层的页面都是VM后缀.但在实践中你会发现VM ...

最新文章

  1. Django 笔记5 -- 数据库
  2. jenkins自动化打包部署
  3. Swift 中函数使用指南
  4. VUe Eelement-ui 兼容es6 兼容IE9+ 报错:SCRIPT1003: 缺少 ':’
  5. 华为数通HCIP笔记
  6. (15)FPGA与CPU区别
  7. Ubuntu-图形界面和字符界面切换快捷键
  8. 笔记本计算机无线开关在哪里,笔记本的WIFI开关在哪里 笔记本WIFI打开方法
  9. 大型API网关(六)—— 监控和预警
  10. 区块链1——区块链基础
  11. Uboot中start.S源码的指令级的详尽解析
  12. python爬取网页内容post_python爬虫之使用POST抓取网页内容
  13. 学习笔记20220513
  14. 【影像学基本知识】有关CT及MRI阅片常识
  15. Git Stash 贮藏命令
  16. Python类中的__dict__属性
  17. win7访问共享文件出现登录失败:禁用当前用户
  18. C#.net 地图控件开发(七) 地图符号,几何图形样式Symbol
  19. 19条优雅Python编程技巧
  20. 蓝桥杯成绩公布——大一零基础如何三个月混到省一?

热门文章

  1. V模型、W模型、H模型
  2. 专访网易游戏美术总监:寻找美术风格的蓝海
  3. MATLAB 默认颜色风格
  4. 分析google adsence
  5. VLAN特性 聚合、MUX VLAN、QinQ、映射
  6. msf渗透命令和后渗透攻击
  7. CGAL Cookbook --CGAL简介
  8. 电脑上的设备驱动程序是什么(通俗解释)
  9. 如何配置springboot (2)-如何打jar包 ---彻骨寒风的博客
  10. 数据库备份与恢复,全备份、增量备份