过完年, 大家都忙碌起来了, 我也不例外. 不过并不是忙碌于去面试找工作, 而是忙碌于现在手上的工作. 闲话不多说了, 进入今天的主题.

一、Index页面在哪里

很奇怪, 在目录bin下面的dll文件中, 都没有看见过视图的具体内容, 那么他们都去哪里了呢?

首先在Index页面中, 加入一句话: @this.GetType().Assembly.Location

当程序运行起来之后, 就可以在页面上看到运行的目录.

我的目录是这个:

C:\Users\xxxxx\AppData\Local\Temp\Temporary ASP.NET Files\vs\31cf6113\79f9587c\App_Web_xwp5b05u.dll

后面我标黄的这一段, 是随机数, 不用去管它. 拿到他直接反编译, 来看一下效果:

[Dynamic(new bool[] { false, true })]
public class _Page_Views_Home_Index_cshtml : WebViewPage<object>
{
// Methods
public override void Execute()
{
((dynamic) base.ViewBag).Title = "Index";
base.BeginContext("~/Views/Home/Index.cshtml", 0x23, , true);
this.WriteLiteral("\r\n\r\n");
base.EndContext("~/Views/Home/Index.cshtml", 0x23, , true);
base.BeginContext("~/Views/Home/Index.cshtml", , 0x20, false);
this.Write(base.GetType().Assembly.Location);
base.EndContext("~/Views/Home/Index.cshtml", , 0x20, false);
base.BeginContext("~/Views/Home/Index.cshtml", 0x48, 0x33, true);
this.WriteLiteral("\r\n\r\n<h2>Index</h2>\r\n<table>\r\n <tr>\r\n <td>");
base.EndContext("~/Views/Home/Index.cshtml", 0x48, 0x33, true);
base.BeginContext("~/Views/Home/Index.cshtml", 0x7c, , false);
this.Write(((dynamic) base.Model).Name);
base.EndContext("~/Views/Home/Index.cshtml", 0x7c, , false);
base.BeginContext("~/Views/Home/Index.cshtml", 0x86, , true);
this.WriteLiteral("</td>\r\n </tr>\r\n <tr>\r\n <td>");
base.EndContext("~/Views/Home/Index.cshtml", 0x86, , true);
base.BeginContext("~/Views/Home/Index.cshtml", 0xaf, , false);
this.Write(((dynamic) base.Model).Age);
base.EndContext("~/Views/Home/Index.cshtml", 0xaf, , false);
base.BeginContext("~/Views/Home/Index.cshtml", 0xb8, 0x2c, true);
this.WriteLiteral("</td>\r\n </tr>\r\n</table>\r\n\r\n<script>\r\n ");
base.EndContext("~/Views/Home/Index.cshtml", 0xb8, 0x2c, true);
base.BeginContext("~/Views/Home/Index.cshtml", 0x160, , true);
this.WriteLiteral("\r\n</script>");
base.EndContext("~/Views/Home/Index.cshtml", 0x160, , true);
} // Properties
protected global_asax ApplicationInstance
{
get
{
return (global_asax) this.Context.ApplicationInstance;
}
}
}

从这里看, 页面上的那些普通的标签语句都通过 this.WriteLiteral() 方法, 解析成字符串了. 而@Model.Name也解析出来了.

这里注意到, 是将Model转成dynamic变量的. 那么, 我在View这里能不能传一个dynamic的值呢? 这个在后面会给出demo.

在上一篇的 System.Web.Mvc.RazorView.RenderView()方法中, 有一句:WebPageRenderingBase startPage = null;

这里的 _Page_Views_Home_Index_cshtml 类, 就是间接继承自 WebPageRenderingBase 类.

二、Razor的基本用法

在MVC中, 在前台页面, 可以借助Razor像后台那样编程. 然后通过 @变量 来输出. 如:

@if (true)
{
<table>
<tr>
<td>@Model.Name</td>
</tr>
<tr>
<td>@Model.Age</td>
</tr>
</table>
}

括号里面, 可以直接写html是因为编译器能识别标签, 知道该怎么去解析.

那么如果我在<script>标签里面也这么写, 如:

@if (true)
{
alert(1);
}

这个是不行的, 因为没有明显的标志, 来让编译器识别, 里面的alert(1)是属于html里面的还是C#语句. 识别不出来的.

那么这时候, 就需要借助别的东西来帮助识别了. 两种方式 : 1. <text></text>  2. @:

<script>
@if (true)
{
@: alert(1);
<text>alert(2);</text>
}
else
{
@: alert('@DateTime.Now.ToString()');
}
</script>

这两种方式都是可以的, 就看个人习惯吧. 在使用<text>的时候, vs缩进的让人看着难受. 就像下面这样:

<script>
@if (true)
{
@: alert(1); <text>
alert(2);
</text> }
else
{
@: alert('@DateTime.Now.ToString()'); }
</script>

两种方式各有优缺点. <text></text>中间可以放很多内容. @:遇到多行时, 每一行都要加.

三、Model传值

在View(model)这里可以传递后台的变量, 那么这个model是存放在哪里的呢?

public TModel Model
{
get
{
return this.ViewData.Model;
}
}

看这里, 是存放在ViewData里面的. 那么也就是说, 我可以在后台通过 ViewData.Model的方式来替换View(model)的方式来传值. 事实上也是可以的.

那么一般类型的值, 肯定都是可以传递的. 上面也说到, 能不能传递dynamic的值呢?

答案是不可以直接传递的, 也就是说我不能这么传递: return View(dynamic), 那能不能传递匿名类型呢:return View(new {name="haha"}) ?

答案也是不可以直接传递.

那么有没有办法来传递这些值呢? 当然可以, 不然我也不会这么问了.

Demo1:

public ActionResult Index()
{
dynamic model1 = new ExpandoObject();
model1.Name = "ExpandoObject";
model1.Age = ;
var res = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(model1));
return View(res);
}

Index页面还是上面的那个. 看一下结果:

这里我一遍序列化与反序列化, 就可以了. 这里的model1当然也可以是匿名类型.

不过这种方式并不推荐使用吧, 也挺麻烦的, 多了一道序列化与反序列化.

目录已同步

MVC源码分析 - View续之Razor的更多相关文章

  1. MVC源码分析 - View

    感觉好久没有学习了, 汗. 年就这么过完了, 感觉没有尝到过年的味道. 现在的年过的有些冷清了. 除了体重证明着我过了一个年, 还有一件值得开心的事情, 终于把女朋友变成未婚妻了. 这是一大进步吧. ...

  2. Spring MVC源码分析(续)——请求处理

    转自:http://blog.csdn.net/shi1122/article/details/8041017 (转移位置了,时光隧道:http://www.jmatrix.org/spring/50 ...

  3. ASP.NET MVC源码分析

    MVC4 源码分析(Visual studio 2012/2013) HttpModule中重要的UrlRoutingModule 9:this.OnApplicationPostResolveReq ...

  4. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证

    原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...

  5. 精尽Spring MVC源码分析 - 一个请求的旅行过程

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  6. 精尽Spring MVC源码分析 - HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  7. 精尽Spring MVC源码分析 - HandlerExceptionResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  8. 精尽Spring MVC源码分析 - RequestToViewNameTranslator 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  9. 精尽Spring MVC源码分析 - LocaleResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

随机推荐

  1. Alpha阶段敏捷冲刺(二)

    1.提供当天站立式会议照片一张. 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 祁泽文:上网了解了艾宾浩斯遗忘曲线算法. 徐璐琳:找交互模块的源 ...

  2. Linux命令行获取本机外网IP地址

    问题: 服务器地址为net映射地址,本机ifconfig无法直接获取映射的公网地址. 方法: [root@TiaoBan- nidongde]# curl http://ifconfig.me 50. ...

  3. EBS中查看其他用户或所有用户的请求和输出文件

      R12: How To Configure Access To Request Output Of The Same Responsibility (Doc ID 804296.1) To Bot ...

  4. Xcode一些好用的插件,以及这些插件的管理器

    最近从xcode6.4升级到xcode7,发现以前所有的插件都失效了,如果要安装,需要重新去一个个下载.安装,很麻烦. 于是,转来了这篇博文,亲自测试,发现很好用...... 地址:http://11 ...

  5. 转:iOS9的新特性以及适配方案

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

  6. matlab 中fft的用法

    一.调用方法X=FFT(x):X=FFT(x,N):x=IFFT(X);x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性. 例:N=8;n=0:N- ...

  7. Azure DevOps Server:Git权限设置

    Azure DevOps Server 权限概述 在Azure DevOps Server (之前名称为TFS)中,权限是一个比较复杂的概念.从权限层级上来说,包括服务器级别.团队项目集合级别.团队项 ...

  8. C# DataGridView中单元格Cell改变事件

    DataGridView控件中的各种事件都无法直接响应Cell中内容的变化,包括KeyPress等事件,可以采用下面方法 private void dataGridViewBarcode_Editin ...

  9. 【CS】笔试常见题目

    网络 IP地址分类 常见网络协议 HTTP状态码 算法 排序问题总结 git git和svn的区别 git常用命令 git暂存区,工作区等 一.网络 1. IP地址分类: IP网络使用32位地址,以点 ...

  10. SpringCloud实现集群和负载均衡

    Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的. 组成部分 spingcloud的五大神兽 服务发现——Netflix Eureka ...