原文引自:http://www.cnblogs.com/Yok/archive/2005/11/07/abc.html
和传统的asp.net webform相比, MonoRail的生命周期简单多了. 一个web请求所经历的主要步骤如下:

1. MonoRailHttpHandlerFactory接收到请求后, 收集上下文, 创建MonoRailHttpHandler.
2. MonoRailHttpHandler分析请求的url, 创建相应的controller并调用相应的action(实际就是controller里的一个方法), url表示了访问的是哪个controller的哪个action. 默认情况下, 格式是/controller名称/action名称.rails. MonoRailHttpHandler会根据请求的url初始化名称相对应的controller并调用相应的action, 例如, home/index.rail对应HomeControll 如果controller继承自SmartDispatcherController, 还会将action的参数与Request的数据进行绑定.
3. Controller调用ViewEngine的Process方法, 输出html内容.

一个页面的生命周期就这样完成了, 是不是觉得很清爽呢 :)

我们再来看看在自己写的action里要做些什么:

1. 处理业务逻辑.
2. 如果需要向view输出内容的话, 把需要被view引用的对象添加到PropertyBag.
3. 如果需要对view进行选择或控制, 调用适当的和view相关的方法.

同样是这么的简单. server control没了, viewstate没了, postback也没了. 在深入了解了MonoRail之后, 你会发现, 这些东西都不是必须的.

下面给MonoRail的各种概念来个比较详细的解释, 大部分摘自MonoRail参考手册

View
默认每个action都会有一个对应的view. 当使用NVelocityViewEngine的时候, view就是一个NVelocity的模板. view文件布局规则如下
view根目录\Controller名称\action名称.vm
Controller在action执行完后, 将会调用模板引擎输出相应的内容. Velocity模板语法参考请看这里

Controller
Controller是MonoRail的核心. MonoRail有一个名为Controller的抽象类, 应用中所有Controller都要从此继承.
Controller的名称一般以Controller后缀, 而Controller的名称默认是类名去掉Controller后缀. 例如HomeController的名称是Home. 如果不

想要这种命名规则的话, 可以标记ControllerDetailsAttribute去指定名称.

下面是基类Controller的一些常用的成员和特性:

Redirect, 和HttpResponse.Redirect类似:
    Redirect( String url )
    Redirect( String controller, String action )
    Redirect( String area, String controller, String action )

CancelView() 如果不需要处理view, 或者甚至action没有对应的view, 就应该调用它停止view的执行

RenderView, 输出view:
   RenderView(String name ) 
   RenderView(String controller, String name )

RenderShareView(String name) :
输出在视图根目录的view. 如果一个view需要被多个controller共用, 就应该放在视图根目录.

RenderText(String name) :
输出一段文本, 实际上等同于Response.Write, 并且调用RenderText后, 原来的view的输出将会被取消.

不要忘了, Response对象还可以照常使用. 在用模板引擎输出一个view的同时, 你也可以通过Response.Write输出一些额外的内容, 例如js.

PropertyBag:
PropertyBag是基类Contorller里的一个简单的IDictionary, 被存放在HttpContext.Current.Item里. 放在PropertyBag里的对象就可以在view里被引用

Flash:
特性和PropertyBag完全一样, 只是语义上的区别, PropertyBag用于给view提供数据, Flash则是用来在Request中存放临时的数据.

Helplers:
NVelocity模板并不像aspx那样可以使用任何.NET语法, 他只允许对特定容器里对象的访问. 如果有需要借助后台的类去对界面显的内容进行处理的话(例如对数字或日期进行格式化), 可以创建对象的实例, 然后添加到Helpers集合里. 例如有一个Fomatter类, 里面有多个用于格式化的方法, 则在action里加上语句:

Helpers.Add("Formatter", new Formatter());

然后就可以在模板里使用Formatter了.

$Formatter.FormatTimeRange($dateFrom, $dateTo)

MonoRail里内置了很多Helper, 例如AjaxHelper, HtmlHelper, ValidationHelper, 在官方的sample中会常见到他们在模板里的使用. 他们是在基类Controller初始化的时候被添加到Helpers集合里的.

在view里引用对象

view要引用到的对象应添加到PropertyBag里. 在NVelocity的模板里, 可以引用以下对象
Context (IRailsEngineContext, 类似HttpContext)
Request 
Response
Session
所有Request中的元素
所有Flash中的元素
所有PropertyBag中的元素

数据绑定

这是一个能让你消除大量无聊的代码的特性, 只要controller继承自SmartDispatcherController, MonoRailHttpHandler就会根据querystring和form提交的数据, 寻找最合适的方法的重载, 并且把post的数据绑定到对应的参数. 支持所有的基本类型以及他们的数组, 还有HttpPostedFile. 参考手册上有这样的例子

<form action="CreateAccount.rails"> 
  Name: <input type="text" name="name" /> <br>
  Email: <input type="text" name="email" /> <br>
  Country: 
  <select name="country"> 
    <option value="44">England</option>
    <option value="55">Brazil</option>
  </select>
  <br>
  <input type="submit" value="Create" />
</form>

这样的form提交后, 对应的action的参数将会被自动绑定

public class AccountController : SmartDispatcherController
{
  public void CreateAccount(String name, String email, int country)
  {
    // perform your create account logic here ..
    Redirect("home", "index");
  }
}

假如存在一个Account类, 我们还可以让他直接创建Account的实例并且绑定数据, 作为参数传给action, 只需在参数加上DataBindAttribute:

public void CreateAccount([DataBind]Account account)
{
   //
}

为了避免html元素id的命名冲突, 还可以通过Prefix属性指定前缀

<form action="CreateAccount.rails"> 
  Name: <input type="text" name="accName" /> <br>
  Email: <input type="text" name="accEmail" /> <br>
  Country: 
  <select name="accCountry"> 
    <option value="44">England</option>
    <option value="55">Brazil</option>
  </select>
  <br>
  <input type="submit" value="Create" />
</form>
public void CreateAccount([DataBind(Prefix="acc")]Account account)
{
   //
}

Webform如此复杂, 主要是为了构造有层次结构的控件树, 实现事件驱动模型和维持控件postback后的状态, 而MonoRail是以controller/action/view为核心, 一个url对应的是controller的一个方法, 来自querystring, form post的数据SmartDispatcherController已经帮你处理好了, 你在action里要做的事情通常只是去处理它为你准备好的参数, 并且把view需要用到的对象放进PropertyBag里, 一切都是如此的简单

转载于:https://www.cnblogs.com/youxiang/archive/2007/03/09/669355.html

MonoRail - 生命周期及controller/action/view详解(转)相关推荐

  1. vue 生命周期的11中方法详解

    vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...

  2. android 生命周期_Android生命周期组件 Lifecycle 源码详解(一)

    在上篇文章: warmcheng:Android生命周期组件 Lifecycle 使用详解​zhuanlan.zhihu.com 中,我们讲了 Lifecycle 的简单使用,本篇我们来研究下它的源码 ...

  3. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  4. java线程6种状态转换,Java线程的生命周期和各种状态转换详解

    在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期.当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exceptio ...

  5. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...

    Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...

  6. 微信小程序生命周期和路由传参详解

    一.生命周期 1.应用级的生命周期 1.onLaunch 当小程序初始化完成时,会触发onLaunch(全局只触发一次) 2.onShow 当小程序启动,或从后台进入前台显示,会触发onShow 3. ...

  7. Maven学习总结(44)——Maven构建时生命周期及其常用集成命令详解

    集成命令:-U -X -B -e clean能够保证上一次构建的输出不会影响到本次构建. 使用deploy而不是install: 构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用 ...

  8. ASP.NET MVC Controller激活系统详解:默认实现

    Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前Cont ...

  9. django性能优化缓存view详解

    缓存提升性能: 1.通常的view会去数据库端执行相关的查询然后交由template渲染.数据库访问通常就是性能的瓶颈所在. 2.由于许多数据要很久才会变一次.两次连续的数据库访问通常返回的数据是一样 ...

  10. Android自定义View详解,知乎上转疯了!

    笼统来说,中年程序员容易被淘汰的原因其实不外乎三点. 1.输出能力已到顶点.这个人奋斗十来年了,依旧碌碌无为,很明显这人的天花板就这样了,说白了,天赋就这样. 2.适应能力越来越差.年纪大,有家庭,老 ...

最新文章

  1. 华为突遭谷歌釜底抽薪!官方安卓不再支持华为手机
  2. mysql1033错误存储引擎_【Mysql问题集锦(1)】mysql不能使用innodb存储引擎
  3. Expert Shell Scripting
  4. python的各种推导式(列表推导式、字典推导式、集合推导式)
  5. 只会用console.log调试?快来试试这些高效的调试方法
  6. 学python有前途吗-Python前景好不好?
  7. spring:利用Spring AOP 使日志输入与方法分离
  8. 快速了解C#接口(Interface)
  9. unity, itween 对不透明对象使用FadeTo需要先更换material
  10. 深入浅出理解 COOKIE MAPPING
  11. MYSQL下载及安装完整教程
  12. Ubuntu:安装yarn
  13. 为什么项目经理比程序员工资高?
  14. 保温杯市场前景分析及行业研究报告
  15. windows 逆向技术必备知识(书籍)
  16. 规划控制下的二阶段设计理论 -【多核服务价值链协同】
  17. UE编辑器格式化java代码
  18. 另类数据:跟踪期货高手持仓策略(完整录播)
  19. 不是因为有希望才坚持,而是因为坚持才有希望!
  20. MISC 入门隐写之用眼睛去倾听

热门文章

  1. 新的域名,新的空间,这里不再更新了。
  2. 阿里的dubbo 到底是用来干嘛的?
  3. CentOS 缺少mysqli扩展 请检查PHP配置
  4. 颜值牛逼惨了的swagger-UI
  5. 卧槽!新来的妹纸rm -rf把公司整个数据库删没了,整个项目组慌了~
  6. 想进入互联网公司,怎能不知道互联网的技术架构!
  7. 别总抱怨自己怀才不遇,告诉你将才与帅才的12个差别!
  8. 请不要再蹭我了,谢谢
  9. 如何正确使用开源项目?
  10. python基础之字典、集合