[ASP.NET MVC Mavericks Road] 03 - Razor 構文

黄舟
リリース: 2016-12-30 13:55:54
オリジナル
1076 人が閲覧しました

[ASP.NET
MVC Mavericks Road] 03 - Razor 構文

Razor は、MVC3 のみの新しいビュー エンジンです。 ASP.NET では、ASPX ビュー エンジンが C# 命令を呼び出すために に依存していることがわかっています。 MVC3 以降、@ マークを使用した新しい Razor 構文のセットがあり、より柔軟で簡潔に使用できます。ここでは、Razor 構文の使用をすぐにマスターできるようにするための簡単な例をいくつか示します。

この記事の目次


準備作業

Razor 構文の使用をデモする前に、いくつかの準備作業を行う必要があります。

1. VS を開き、ASP.NET MVC の空のプロジェクトを作成します。これは非常に簡単なので、詳細は説明しません。

2. モデルを追加します。プロジェクトの Models フォルダーに Product という名前のクラスを追加します。ここでは、前の C# ナレッジ ポイントの概要で使用した Product クラスに移ります。コードは次のとおりです:

namespace MvcApplication1.Models {
    public class Product {
        public int ProductID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public string Category { set; get; }
    }
}
ログイン後にコピー

3. コントローラーを追加します。プロジェクト内の Controllers フォルダーを右クリックし、[コントローラーの追加] を選択し、以下に示すように名前を付けます。

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

[追加] をクリックした後、ProdcutController のコードを次のように編集します。

using System.Web.Mvc;
using MvcApplication1.Models; 

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Index()
        {
            Product myProduct = new Product {
                ProductID = 1,
                Name = "苹果",
                Description = "又大又红的苹果",
                Category = "水果",
                Price = 5.9M
            };
            return View(myProduct); 
        }
    }
}
ログイン後にコピー

4. ビューを追加します。 Index メソッドを右クリックし、[ビューの追加] を選択し、ポップアップ ウィンドウで次のように設定します。

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

[追加] をクリックすると、システムによって Product フォルダーと Index.cshtml ファイルのコンテンツが自動的に作成されます。 Index.cshtml は次のとおりです:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
ログイン後にコピー

5. デフォルト ルートを変更します。便宜上、アプリケーションの起動を必要なリクエスト処理 (この場合は Product/Index) に誘導する必要があります。 Global.asax ファイルを開き、RegisterRoutes メソッドの下にある Routes.MapRoute メソッドを見つけて、以下に示すように、コントローラーの値を「Product」に変更します。

routes.MapRoute(
    "Default", // 路由名称
    "{controller}/{action}/{id}", // 带有参数的 URL
    new { controller = "Product", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
ログイン後にコピー

これらの意味に関係なく、後の記事で説明します。ルーティングのご紹介です。この時点で、F5 キーを押すと、プログラムが通常どおり実行され、準備が完了します。

Model オブジェクトの使用

Razor 構文を紹介します。Index.cshtml ファイルの最初の行から始めましょう:

@model MvcApplication1.Models.Product
ログイン後にコピー

Razor ステートメントはすべて @ 記号で始まります。各ビューには独自の Model プロパティ (@Model 経由で呼び出されます) があります。上記のコードは、このビューの Model 属性の型を、強い型付けを実装する MvcApplication1.Models.Product 型にポイントすることを意味します。強い型指定の利点の 1 つは、Model オブジェクトのメンバー名を間違って記述した場合に、コンパイラがエラーを報告することです。もう 1 つの利点は、VS のコード インテリジェント プロンプトを使用して、コードの記述を自動的に完了できることです。 VS での型メンバー呼び出し。 もちろん、このコードはプログラムなしでも通常どおり実行できますが、コードを記述する際に特定の困難が生じるだけです。

ビューの Model プロパティは、コントローラーによって渡されたモデル インスタンス オブジェクトを格納するために使用されます (この例では、ProductController が「return View(myProduct)」を通じて Index ビューに渡されます)。次のコードは、呼び出し方法を示しています。モデル オブジェクト:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}
<!-- 调用Product实例的Name属性 -->
<h2>名称:@Model.Name</h2>
ログイン後にコピー

Model 属性タイプの宣言に使用されるコードの最初の行では @model (小文字の m) が使用され、呼び出し側コントローラーによって渡される Model オブジェクトでは @ Model が使用されることに注意してください。 .<属性名>(大文字M)。 F5 キーを押すと次のような効果があります:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

式を使用する

上面讲的使用Model对象是很常用的一种Razor代码。其实上面示例中的@Model.Name就是一个简单的表达式,表示向Web页面呈现Model.Name的文本值。Razor语法中的表达式除了可以使用Model对象,也可以使用几乎任何一个其他可访问权限范围内的对象,来向Web面面输出该对象成员的文本值。如下代码所示:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}

现在的时间是: @DateTime.Now.ToShortTimeString()
ログイン後にコピー

运行效果如下:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

这种使用对象的简单表达式(@DateTime.Now.ToShortTimeString()和@Model.Name),在这我们不防称之为对象表达式。

除了对象表达式,还可以是其他任意的有返回值的表达式,如条件表达式。如下面代码所示:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}

现在的时间是: @DateTime.Now.ToShortTimeString()


@(DateTime.Now.Hour>22 ? "还早,再写一会吧!" : "该睡觉咯!")
ログイン後にコピー

运行效果如下:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

注意,一般使用非对象表达式时都需要用小括号括起来。


使用代码块

和表达式的使用方式一样,Razor语法中也可以使用由{}括起来的单个C#过程控制代码块(如if、switch、for等)。使用方式如下:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}

@if (Model.Price > 5M) {
    string test = "买不起!";
    <p>@Model.Name <b>太贵了!</b> @test </p>
}
ログイン後にコピー

效果如下:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

由{}括起来的代码块内可以写任何C#代码,也可以使用任何HTML标签。但需注意的是,当控制语句内只有一句代码时不能像写C#后台代码一样省略大括号。

还有一种更常用的使用代码块的方式。你也可以通过以@{开始,以}闭合的方式来使用代码块,它可以把多个代码块放在一起,开成一个更大的代码块。如下代码所示:

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Index";
}
@{
    if(Model.Category=="水果"){
        string test="是一种水果。";
        @Model.Name @test
    }
    if (Model.Price > 5M) {
        string test = "买不起!";
        <p>@Model.Name <b>太贵了!</b> @test </p>
    } 
}
ログイン後にコピー

运行结果如下:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

使用@:和text标签

我们注意到,在代码块中,要么是C#代码,要么是HTML标签,不能直接写纯文字,纯文字须包裹在HTML标签内。但如果需要在代码块中直接输出纯文字而不带HTML标签,则可以使用@:标签,在代码块中输出纯文本文字非常有用。如下代码所示:

...

@if (Model.Price > 5M) {
    @Model.Name@:太贵了 。
    <br />
    @: @@:后面可以是一行除@字符以外的任意文本,包括<、>和空格,怎么写的就怎么输出。
    <br />
    @: 如果要输出@符号,当@符号前后都有非敏感字符(如<、{、和空格等)时,可以直接使用@符号,否则需要使用两个@符号。
}
ログイン後にコピー

注意@符号的使用。上面代码运行效果如下:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

使用@:标签在代码块中输出一行不带html标签的文本非常方便,但如果需要在代码块中输出续或不连续的多行纯文本,则使用text标签较为方便,如下代码所示:

...

@if (Model.Price > 5M) {
    <text>

    名称:<b>@Model.Name</b><br />
    分类:<b>@Model.Description</b><br />
    价钱:<b>@Model.Price</b><br />
    
    <pre class="brush:php;toolbar:false">
        测试行一: <a>aaaa</a>
        测试行二: @@ fda@aaa
    
ログイン後にコピー
}

运行结果:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

使用ViewBag

上面讲了通过Model对象来从Controller传递数据到View。和Model对象一样,ViewBag对象也可以用来从Controller传递数据到View。下面代码演示了如何在ProductController中使用ViewBag:

public ActionResult Index()
{
    Product myProduct = new Product {
        ProductID = 1,
        Name = "苹果",
        Description = "又大又红的苹果",
        Category = "水果",
        Price = 5.9M
    };
    ViewBag.TestString = "这是一行测试文字!";
    return View(myProduct); 
}
ログイン後にコピー

不一样的是,ViewBag是动态类型,其中TestString是自己定义的。ViewBag在View中的使用方式是和Model一样,如下:

...

动态表达式解析的时间是:@ViewBag.TestString
ログイン後にコピー

运行结果就不贴图了。


使用Layuot

前面我们创建一个视图的时候,我们勾选了使用布局和母版页,但没有告诉VS使用哪一个。请仔细看下图:

[ASP.NET MVC Mavericks Road] 03 - Razor 構文

这个对话框告诉我们“如果在Razor _viewstart中设置了此选项,则留空”。在项目的Views文件夹中,我们可以看到一个_ViewStart.cshtml文件,里面的内容是:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
ログイン後にコピー

MVC呈现视图的时候,默认情况下会自动查找_ViewStart.cshtml文件,以它作为母版来呈现用户请求的视图。母版的呈现是MVC内部处理的,这种以下划线(_)开头的视图文件,一般是不能直接返回给用户。

使用布局或母版页的好处是,我们不需要在每个视图中都设置一份相同的内容。按照_ViewStart.cshtml文件内容指示的路径,我们找到_Layout.cshtml文件,打开它会发现我们在Index视图中定义的 ViewBag.Title = "Index" 就是在这里调用的:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>

<body>
    @RenderBody()
</body>
</html>
ログイン後にコピー

类似于ASP.NET母版页中的ContentPlaceHolder服务器控件,在MVC中使用@RenderBody()来呈现子Web页面的内容,它可以省去我们在每个视图文件中写相同的html元素、JS和样式等的工作。

如果创建一个视图不想使用Layout,则可以在创建视图的对话框取消“使用布局和母版页”选项,创建后会生成如下代码:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>About</title>
</head>
<body>
    <div>
        
    </div>
</body>
</html>
ログイン後にコピー

由于没有使用Layout,视图中必须包含用于呈现HTML页面每个基本元素,而且必须指定Layout=null。


 以上就是[ASP.NET MVC 小牛之路]03 - Razor语法的内容,更多相关内容请关注PHP中文网(www.php.cn)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!