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

原文:返璞归真 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 = 1, Name = "webabcd", DateOfBirth = new DateTime(1980, 2, 14), Comment = "<b>mvp</b>" },
                new User { ID = 2, Name = "prettygyy", DateOfBirth = new DateTime(1981, 6, 26), 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
[源码下载]

时间: 2024-10-31 16:11:24

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

返璞归真 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 上传文件, .net 4.5 带来的更方便的异步操作 [索引页][源码下载] 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

返璞归真 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 4.0 新特性之移动特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax.cs /* * 为

返璞归真 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 mvc 3.0 新特性之 Controller 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 3.0 新特性之 Controller: Global Action Filter 可以在标记为 ChildActionOnly 的 Action 上使用 OutputCa

返璞归真 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 3.0 新特性之 Model 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 3.0 新特性之 Model: 通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证 双重验证中,使客户端实现远程的异步验证 自定义 Data Anno

返璞归真 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 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 2.0 新特性:如通过 DataAnnotations 实现数据验证及客户端验证,MVC 与 Dynamic Data 的结合,对异步 Controller 的支持,对 Area 的支持,新增的一些帮助方法等 示例1.新特

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

原文:返璞归真 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 新特性 MVC5, WebAPI2(Attribute Routing, Cross Origin Request Sharing, OData), SignalR, SPA(Single Page Appl

返璞归真 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 mvc 4.0 新特性之 Web API 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 4.0 新特性之 Web API 开发一个 CRUD 的 Demo,服务端用 Web API,并使其支持 jsonp 协议,客户端用 jQuery 示例1.自定义一个 JsonMe

ASP.NET4.0新特性

原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音以致放弃在LiveMeeting上的这次讲课,也导致了本篇的产生. 新增了项目模板 在创建Web项目时可以看到增加了更多的Web项目模板在VS2008中对应的情况如下: 在新模板中有如下改进:基础MemberShip功能.在大多数网站和应用程序中需要进行认证,因此在新模板中增加了认证功能使得用户能在

ASP 3.0新特性概要

 ASP 3.0新特性概要 在ASP3.0中,有一些新的特性或经历较大的变化或改进的特性.1. 无脚本的ASPASP处理不包括任何脚本的.asp页的速度是很快的,假如你正在创建的站点或Web应用程序文件最终可能使用ASP,最好让这些文件使用.asp文件扩展名,而不用考虑它们是包含服务器端脚本还是仅仅包含静态(HTML和文本)内容. 2. 新的流向控制能力到目前为止,假如想把执行转向另外的一个ASP页,不得不使用Response.Redirect语句,这个工作通过向客户端发送一个响应来指示其载入新