原文:返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor)

[索引页]
[源码下载]

返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor)

作者:webabcd

介绍
asp.net mvc 之 asp.net mvc 3.0 新特性之 View(Razor):

  • Razor 的语法
  • Razor 与 Model
  • Razor 与布局

示例
1、Razor 概述
RazorDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class RazorDemoController : Controller
{
public ActionResult Summary()
{
return View();
}
}
}

Summary.cshtml

@{
ViewBag.Title = "Razor 概述";
} <p>
使用 Razor 之前,要在 Web.Config 中做如下配置
<br />
<textarea rows="20" style="width: 100%">
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections> <system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
</textarea>
</p> <p>
View 在每次 Render 之前都会先执行 _ViewStart.cshtml 中的代码
</p>

2、Razor 语法简介
RazorDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class RazorDemoController : Controller
{
public ActionResult Syntax()
{
return View();
}
}
}

Syntax.cshtml

@{
ViewBag.Title = "Razor 语法";
} <p>
使用@符号加{},直接在 html 页面中写 C#
<br />
@{ var currentTime = DateTime.Now; } @* 相当于 <% Htmlvar currentTime = DateTime.Now; %> *@
@currentTime.ToString("yyyy-MM-dd")
</p> <p>
使用@符号,直接在 html 页面中写 C# 并输出结果
<br />
当前 URL:
@Request.Url @* 相当于 <%= Request.Url %> *@
<br />
当前 URL:
@{
@Request.Url;
}
</p> <p>
想输出字符@怎么办?,那就@@
<br />
webabcd@@abc.com
</p> <p>
在 Razor 中写服务端注释(客户端不可见)
@* code *@
</p> <p>
Razor 自带的类型转换方法
<br />
例:AsInt(), IsInt(), AsBool(), IsBool(), AsFloat(), IsFloat(), AsDecimal(), IsDecimal(), AsDateTime(), IsDateTime()
<br />
类似 AsInt() 的方法会有一个重载方法 AsInt(int defaultValue),用于当转换失败时返回指定的默认值
@{
var tmp = "2/14/1980";
var date = tmp.AsDateTime();
}
@date.ToString("yyyy-MM-dd")
</p> <p>
输出文本的方法
<br />
@*
<text></text>
或者
@:
*@
@{
<text>我是文本</text>
<br />
@:我是文本
}
</p> <p>
获取文件的 URL 绝对路径的方法,一般用于 img 标签,link 标签,a 标签中所引用的文件的完全 url 路径
<br />
<img alt="" src="@Href("~/Content/themes/base/images/ui-icons_888888_256x240.png")" />
</p> <p>
Html Helper, Ajax Helper, Url Helper 依然可以使用
<br />
@Html.TextBox("txt", "我是 TextBox")
</p>

3、Razor 的与 Model 相关的 Demo
User.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MVC30.Models
{
public class User
{
public int ID { get; set; } public string Name { get; set; } public string Password { get; set; } public string ConfirmPassword { get; set; } public DateTime DateOfBirth { get; set; } public string Comment { get; set; }
}
}

RazorDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class RazorDemoController : Controller
{
// 用于演示 View 如何获取数据
public ActionResult Model()
{
// ViewBag 的本质就是把 ViewData 包装成为 dynamic 类型
ViewBag.Author = "webabcd"; var list = new List<User>()
{
new User { ID = , Name = "webabcd", DateOfBirth = new DateTime(, , ), Comment = "<b>mvp</b>" },
new User { ID = , Name = "prettygyy", DateOfBirth = new DateTime(, , ), Comment = "<b>mvp</b>" }
}; return View(list);
}
}
}

_MyLayout_ParitalView.cshtml

@*
通过 @model 指定 Model 的类型,同时 Model 对象就是 Html.Partial() 或 Html.RenderPartial() 时传递过来的对象
*@ @using MVC30.Models;
@model User <li>@Model.Name</li>

Model.cshtml

@*
通过 @using 引入命名空间
通过 @model 指定 Model 的类型,同时 Model 对象就是 Action 返回的数据
*@ @using MVC30.Models;
@model List<User> @{
ViewBag.Title = "Razor 的与 Model 相关的 Demo";
} <p>
<!--
演示 ViewBag 的用法
-->
Author: @ViewBag.Author
</p> <div>
<ul>
<!--
Model 就是 Action 返回的数据
-->
@foreach (var user in Model)
{
if (@user.Name == "webabcd")
{
<!--
默认输出的是经过 HTML 编码后的数据,如果需要输出原始数据则使用 Html.Raw()
-->
<li>@user.Name (@Html.Raw(@user.Comment))</li>
}
else
{
<li>@user.Name (@user.Comment)</li>
}
}
</ul>
</div> <!--
Html.Partial 与 Html.RenderPartial 的区别:
Html.Partial - 直接将 View 的结果作为一个字符串输出
Html.RenderPartial - 将 View 作为一个用户控件嵌入到当前的 HttpContext 中 Html.Action 与 Html.RenderAction 的区别(演示参见 ControllerDemo/ChildActionOnlyDemo.cshtml):
Html.Action - 直接将 Action 的结果作为一个字符串输出
Html.RenderAction - 将 Action 作为一个用户控件嵌入到当前的 HttpContext 中 Html.Partial, Html.RenderPartial 与 Html.Action, Html.RenderAction 的区别:
二者都需要指定 View,前者的 View 不需要 Action,而后者的 View 必须要有 Action
-->
<div>
<ul>
@foreach (var user in Model)
{
@Html.Partial("_MyLayout_ParitalView", user)
@*
<%= Html.Partial("_MyLayout_ParitalView", user) %>
*@
}
</ul>
</div> <div>
<ul>
@{
var firstUser = Model.First();
Html.RenderPartial("_MyLayout_ParitalView", firstUser);
@*
<% Html.RenderPartial("_MyLayout_ParitalView", firstUser); %>
*@
}
</ul>
</div>

4、Razor 的与布局相关的 Demo
RazorDemoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; using MVC30.Models; namespace MVC30.Controllers
{
public class RazorDemoController : Controller
{
public ActionResult LayoutView()
{
return View();
}
}
}

_ViewStart.cshtml

@{
// View 在每次 Render 之前都会先执行 _ViewStart.cshtml 中的代码
Layout = "~/Views/Shared/_Layout.cshtml";
}

_Layout.cshtml

<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<!--
Url.Content() - 将指定的相对路径转换为绝对路径
-->
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
</head> <body>
@RenderBody()
</body>
</html>

_MyLayout_MasterPage.cshtml

<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div style="background-color: Gray">
<!--
引用此 Layout 的页上的未指明 Section 的内容会在此 Render
-->
@RenderBody()
</div>
@if (IsSectionDefined("mySection"))
{
// 引用此 Layout 的页后,如果指定名为 mySection 的 Section 的话,其会在此处 Render
// 第二个参数的意思是,引用此 Layout 的页是否必须有名为 mySection 的 Section
@RenderSection("mySection", false)
}
else
{
@:没有 mySection
}
</body>
</html>

_MyLayout_RenderPage.cshtml

<h1>
RenderPage
<br />
@{
// 获取 RenderPage() 传递过来的参数
if (@PageData["param"] == "abc")
{
@:param == "abc"
}
if (@PageData["param2"] == "xyz")
{
@:param == "xyz"
}
}
</h1>

LayoutView.cshtml

@{
// 指定一个 Layout 页(相当于母版页)
Layout = "_MyLayout_MasterPage.cshtml";
ViewBag.Title = "Razor 的与布局相关的 Demo";
} <!--
在 Layout 中的 RenderBody() 中显示
RenderPage() 的第二个参数的意思:给 _MyLayout_RenderPage.cshtml 传递参数
-->
在 RenderBody() 中显示的内容
@RenderPage("~/Views/RazorDemo/_MyLayout_RenderPage.cshtml", new { param = "abc", param2 = "xyz"}) <!--
在 Layout 中的 RenderSection("mySection") 中显示
-->
@section mySection {
<b>My Section</b>
}

5、其他

<p>
Razor 的 dll 在这里 C:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies
</p>
<p>
Razor 中约定:布局 View 或者需要被别的 View 引用的 View 要以“_”开头
</p>
<p>
asp.net mvc 3.0 的 T4 模板的位置在 D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 3\CodeTemplates
<br />
如果不想修改默认模板的话,那么就将模板安装到当前项目中,然后只修改当前项目的 T4 模板,方法如下:
<br />
Tools -> Library Package Manager -> Package Manager Console,然后输入 install-package mvc3codetemplatescsharp,之后 CodeTemplates 文件夹就会添加到当前项目中
</p>
<p>
新增的 HTML Helper,例如:Chart, WebGrid, WebImage, WebMail, Crypto 等,详见 System.Web.Helpers.dll
</p>

OK
[源码下载]

返璞归真 asp.net mvc (9) - asp.net mvc 3.0 新特性之 View(Razor)的更多相关文章

  1. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  2. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  3. 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

    原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...

  4. 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

  5. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  6. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...

  7. 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性

    原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 [索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 ...

  8. asp.net mvc 4.0 新特性之移动特性

    asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax ...

  9. ASP.NET4.0新特性

    原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音 ...

随机推荐

  1. [置顶] C++学习书单

    关于C++的书太多了,很容易让人没有头绪.一直想整理下,把这些书列个书单出来,直到今天才动手.希望我的经验能给后来的初学者一点帮助. 1.<C++程序设计教程> 钱能 很多学校把这本书选做 ...

  2. AppWidget应用(二)---PendingIntent 之 getActivity

    通过AppWidget应用(一)的介绍,我们已经知道如何创建一个在主界面上显示一个appWidget窗口,但这并不是我们的目的,我们需要做到程序与用户之间进行交互:下面来介绍下如何通过appWidge ...

  3. veridata实验举例(6)验证agent启动先后顺序是否对捕获update操作有影响

    veridata实验举例(6)验证agent启动先后顺序是否对捕获update操作有影响 续接veridata实验系列  上篇:"veridata实验举例(5)改动主键上的列值.update ...

  4. 斯坦福ML公开课笔记14——主成分分析

    上一篇笔记中,介绍了因子分析模型,因子分析模型使用d维子空间的隐含变量z来拟合训练数据,所以实际上因子分析模型是一种数据降维的方法,它基于一个概率模型,使用EM算法来预计參数. 本篇主要介绍PCA(P ...

  5. 屌丝程序猿赚钱之道之taobao 2

    续上篇,之前写的案例,都是比較0基础的. 案例4:  代写情书.软文.论文等等. 这是我一个同学的真实故事.     我隔壁寝室的小王平时没事就爱谢谢博客.逛逛论坛.大二的时候接触了威客网,開始在网上 ...

  6. Unity3D中的Update, FixedUpdate, LateUpdate的区别

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  7. vim netrw

    我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件).例如,我们在vim中执行命令”:e -/ ...

  8. Web测试基于实际测试的功能测试点总结--转载

    文章来源:http://www.51testing.com/html/99/n-854599.html 好文章就该记录一下\(^o^)/~ 一.页面链接检查:测试每一个链接是否都有对应的页面,并且页面 ...

  9. python学习笔记之五:抽象

    本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途. 一. 创建函数 函数是可以调用,它执行某种行为并且返回一个值.用def语句即可定义一个函数:(并非所 ...

  10. (step7.2.2)hdu 2161(Primes——判断是否是素数)

    题目大意:输入一个n,判断您是否是素数.. 解题思路:简单数论 代码如下: /* * 2161_1.cpp * * Created on: 2013年8月31日 * Author: Administr ...