介绍 ASP.NET Web 编程使用 Razor 语法 (C#)

介绍 ASP.NET Web 编程使用 Razor 语法 (C#)
微软 ASP.NET 团队|2012 年 5 月 22 日

这篇文章给你编程的概述与 ASP.NET 网页中使用 Razor 语法。ASP.NET 是微软的技术,用于在 web 服务器上运行动态 web 页。使用 C# 编程语言中侧重于此的文章。

你会学到什么:

  • 顶尖 8 编程入门编程使用 Razor 语法的 ASP.NET Web 页面的提示。
  • 你需要基本的编程概念。
  • 什么 ASP.NET 服务器代码和 Razor 语法是所有有关。
请注意在这篇文章的信息适用于 ASP.NET 网页 1.0 和 Web 页 2。凡有版本之间的差异,文字描述的差异。

顶尖 8 编程提示

本节列出了一些你绝对需要知道随着您开始编写使用 Razor 语法的 ASP.NET 服务器代码的提示。

请注意Razor 语法基于 C# 编程语言,语言,这与 ASP.NET 网页中最常使用的语言。然而,Razor 语法还支持 Visual Basic 语言,和你看到您也可以在 Visual Basic 中的一切。有关详细信息,请参阅附录Visual Basic 语言和语法.

后来在文章中,可以找到有关大部分这些编程技术的更多详细信息。

1.您将代码添加到页面使用 @ 字符

@字符开始内联表达式、 单个语句块和多语句块:

<!-- Single statement blocks  -->
@{ var total = 7; }
@{ var myMessage = "Hello World"; }

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>

<!-- Multi-statement block -->
@{
    var greeting = "Welcome to our site!";
    var weekDay = DateTime.Now.DayOfWeek;
    var greetingMessage = greeting + " Today is: " + weekDay;
}
<p>The greeting is: @greetingMessage</p>

这是这些语句在浏览器中运行的页时的外观:

Razor-Img1

2.您将代码块括在大括号中

一个代码块包含一个或多个代码语句,并括在大括号中。

<!-- Single statement block.  -->
@{ var theMonth = DateTime.Now.Month; }
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}
<p>Today's weather: @weatherMessage</p>

会显示在浏览器中的结果:

Razor-Img2

3.里面一个块,你最终每个代码语句以分号

在代码块内,每个完整的代码语句必须以分号结束。内联表达式别以分号结束。

<!-- Single-statement block -->
@{ var theMonth = DateTime.Now.Month; }

<!-- Multi-statement block -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}

<!-- Inline expression, so no semicolon -->
<p>Today's weather: @weatherMessage</p>

4.您使用变量来存储值

可以将值存储在变量中,包括字符串、 数字和日期等。您创建新的变量使用var关键字。您可以直接在页中使用插入变量值@.

<!-- Storing a string -->
@{ var welcomeMessage = "Welcome, new members!"; }
<p>@welcomeMessage</p>

<!-- Storing a date -->
@{ var year = DateTime.Now.Year; }

<!-- Displaying a variable -->
<p>Welcome to our new members who joined in @year!</p>

会显示在浏览器中的结果:

Razor-Img3

5.您将文本字符串值括在双引号中

一个字符串是作为文本处理的字符序列。若要指定一个字符串,你将它放在双引号中:

@{ var myString = "This is a string literal"; }

如果您想要显示的字符串包含一个反斜杠字符 (\) 或双引号 ( " ),与@运算符一起使用原义字符串为前缀。(在 C# 中,\ 字符具有特殊含义,除非您使用逐字字符串.)

<!-- Embedding a backslash in a string -->
@{ var myFilePath = @"C:\MyFolder\"; }
<p>The path is: @myFilePath</p>

若要嵌入双引号括起来,使用逐字字符串和重复引号:

<!-- Embedding double quotation marks in a string -->
@{ var myQuote = @"The person said: ""Hello, today is Monday."""; }
<p>@myQuote</p>

这里是在页中使用这两个示例的结果:

Razor-Img4

请注意注意的@字符用来标记在 C# 中逐字字符串,并标记在 ASP.NET 页中的代码。

6.代码是区分大小写

在 C# 中,关键字 (比如var、true,和if) 和变量名称是区分大小写的。下面的代码行创建两个不同的变量,lastName和LastName.

@{
    var lastName = "Smith";
    var LastName = "Jones";
}

如果你声明一个变量作为var lastName = "Smith";和错误如果您尝试引用该变量作为@LastName的网页中,结果因为不会承认LastName。

请注意在 Visual Basic 中,关键字和变量是不敏感的案件。

7.您的编码的大部分涉及对象

对象表示您可以用编程的东西 — — 一页、 一个文本框、 文件、 图像、 web 请求、 电子邮件、 客户记录 (数据库行) 等。对象具有属性的描述他们的特征和你可以读取或更改 — — 文本框对象都有一个Text属性 (及其他)、 一个请求对象都有一个Url属性、 电子邮件消息具有From属性,和一个客户对象有一个FirstName属性。对象也有"动词"他们可以执行的方法。例子包括一个文件对象Save方法、 图像对象的Rotate方法和对象的电子邮件Send方法。

你常常会在页面上,什么类型的浏览器提出请求的 URL 的页面、 用户标识等工作Request对象时,它给你像值文本框中 (窗体字段) 的信息。下面的示例演示如何访问Request对象的属性以及如何调用MapPath方法Request的对象,它在服务器上为您提供页的绝对路径:

<table border="1">
<tr>
    <td>Requested URL</td>
    <td>Relative Path</td>
    <td>Full Path</td>
    <td>HTTP Request Type</td>
</tr>
<tr>
    <td>@Request.Url</td>
    <td>@Request.FilePath</td>
    <td>@Request.MapPath(Request.FilePath)</td>
    <td>@Request.RequestType</td>
</tr>
</table>

会显示在浏览器中的结果:

Razor-Img5

8.您可以编写代码可以作出的决定

动态 web 页的一个关键特征是你可以确定怎么做基于条件。执行此操作的最常见方法是用 if语句 (和可选else语句)。

@{
   var result = "";
   if(IsPost)
   {
      result = "This page was posted using the Submit button.";
   }
   else
   {
      result = "This was the first request for this page.";
   }
}

<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>
<body>
<form method="POST" action="" >
  <input type="Submit" name="Submit" value="Submit"/>
  <p>@result</p>
</form>
</body>
</html>
    </body>
</html>

语句if(IsPost)是写作if(IsPost == true)的简写方法。沿if发了言,有很多种方法,测试条件,重复代码块,等等,其中介绍和本文中稍后介绍。

会显示在浏览器中 (点击提交后的结果):

Razor-Img6

一个简单的代码示例

此过程显示了如何创建一个网页,说明了基本的编程技术。在示例中,您创建一个允许用户输入两个数字,然后将它们添加,并显示结果页面。

  1. 在编辑器中,创建一个新文件并将其命名AddNumbers.cshtml.
  2. 将下面的代码和标记复制到页面,替换已经在页面中的任何东西。
    @{
        var total = 0;
        var totalMessage = "";
        if(IsPost) {
    
            // Retrieve the numbers that the user entered.
            var num1 = Request["text1"];
            var num2 = Request["text2"];
    
            // Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt();
            totalMessage = "Total = " + total;
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>Add Numbers</title>
        <meta charset="utf-8" />
        <style type="text/css">
          body {background-color: beige; font-family: Verdana, Arial;
                margin: 50px; }
          form {padding: 10px; border-style: solid; width: 250px;}
        </style>
      </head>
    <body>
      <p>Enter two whole numbers and then click <strong>Add</strong>.</p>
      <form action="" method="post">
        <p><label for="text1">First Number:</label>
          <input type="text" name="text1" />
        </p>
        <p><label for="text2">Second Number:</label>
          <input type="text" name="text2" />
        </p>
        <p><input type="submit" value="Add" /></p>
      </form>
    
      <p>@totalMessage</p>
    
    </body>
    </html>
    
    在这里有一些事情你要注意:
    
        在@字符开始第一个代码块在页面中,和它前面的totalMessage变量的嵌入在页面的底部附近。
    
        在页面的顶部块括在大括号中。
    
        在顶部的块中,所有行都以分号都结束。
    
        变量total、 num1、 num2和totalMessage存储几个数字和一个字符串。
    
        分配给totalMessage变量的字符串值是在双引号中。
    
        因为代码是区分大小写,当totalMessage变量用于在页面的底部附近时,其名称必须完全匹配的变量在顶部。
    
        表达式num1.AsInt() + num2.AsInt()演示如何使用对象和方法。每个变量上的AsInt方法将转换的字符串 (一个整数) 有很多由用户输入,这样你可以对它执行算术。
    
        <form>标记包括method="post"属性。此选项指定当用户单击添加,将使用 HTTP POST 方法向服务器发送页面。当提交页面时, 
    if(IsPost)测试计算结果为 true 的条件代码运行,显示的数字相加的结果。
    3. 保存页面并在浏览器中运行它。(请确保在运行它之前的文件工作区中选择了页。输入两个完整的数字,然后单击添加按钮。

    Razor-Img7

基本编程概念

这篇文章为您提供了 ASP.NET web 编程的概述。它不是详尽无遗的考试,只是快速浏览您将最常使用的编程概念。即便如此,它涵盖了几乎所有你会需要入门 ASP.NET 网页。

但第一次,一个小小的技术背景。

Razor 语法、 服务器代码和 ASP.NET

Razor 语法是简单的编程语法,用于在网页中嵌入基于服务器的代码。在 web 页使用 Razor 语法中,有两种类型的内容: 客户端的内容和服务器代码。客户端的内容是你习惯了在 web 页中的东西: HTML 标记 (元素),样式信息,如 CSS,也许 JavaScript 和纯文本等一些客户端脚本。

Razor 语法允许您将服务器代码添加到此客户端的内容。如果有服务器代码页中,在服务器运行该代码首先,之前它将该页发送到浏览器。通过在服务器上,运行该代码可以执行任务,可以更多的复杂,要做使用单独的客户端内容喜欢访问基于服务器的数据库。最重要的是,服务器代码可以动态地创建客户端的内容 — — 它可以生成的 HTML 标记或其他动态内容,然后将它发送到与该页面可能包含任何静态 HTML 的浏览器。从浏览器的角度来看,由您的服务器代码生成的客户端内容是比任何其他客户端内容没有什么不同。如你已经看到,具有所需的服务器代码是相当简单的。

包括 Razor 语法的 ASP.NET 网页中有一个特殊的文件扩展名 (.cshtml.vbhtml)。服务器承认,这些扩展,运行的代码,使用 Razor 语法标记,然后将页面发送到浏览器。

ASP.NET 适用哪?

Razor 语法基于从调用 ASP.NET,反过来基于 Microsoft.NET 框架的 Microsoft 技术。命名空间是一个大的、 全面的编程框架,从 Microsoft 开发几乎任何类型的计算机应用程序。ASP.NET 是专门设计用于创建 web 应用程序的.NET 框架的一部分。开发人员使用 ASP.NET 创建的最大和最高流量的网站很多在世界。(你看到文件的扩展名.aspx作为一个站点中的 URL 的一部分的任何时间你就知道该网站写使用 ASP.NET。)

Razor 语法赋予您的 ASP.NET 中,但使用的简化的语法是易学习如果你是一个初学者,这让你更有成效,是否你是一位专家的所有权力。即使此语法是使用简单,对 ASP.NET 和.NET 框架及其家庭关系意味着随着您的网站变得更复杂,你有更大的框架提供给你的权力。

Razor-Img8

基本语法

刚才您看到了如何创建一个 ASP.NET 网页页面上,以及如何可以将所需的服务器代码添加到 HTML 标记的基本示例。在这里您会了解的编写 ASP.NET 服务器代码使用 Razor 语法基础知识 — — 就是编程语言的规则。

如果你有经验与编程 (特别是如果你使用过 C、 c + +、 C#、 Visual Basic 中或 JavaScript),这里你阅读的大部分会熟悉。您可能需要自己熟悉仅服务器代码添加到.cshtml文件中的标记的方式。

结合文字、 标记和代码块中的代码

在服务器代码块中,经常要输出的文本或标记 (或两者) 到的页。如果服务器的代码块中包含的文本的代码并不,而是应呈现是,ASP.NET 需要,以便能够区分该文本和代码。有几种方法来执行此操作。

    将文本中的 HTML 元素像<p></p> <em></em>括起来:

    @if(IsPost) {
        // This line has all content between matched <p> tags.
        <p>Hello, the time is @DateTime.Now and this page is a postback!</p>
    } else {
        // All content between matched tags, followed by server code.
        <p>Hello <em>stranger</em>, today is: <br /> </p>  @DateTime.Now
    }

    HTML 元素可以包含文本、 其他 HTML 元素和服务器的代码表达式。当 ASP.NET 看到 HTML 标记 (例如, <p>) 开幕时,它呈现的一切包括元素和其内容为在浏览器中,
它随着解决服务器代码表达式。 使用@:运算符或
<text>元素。@:输出单个行的内容包含纯文本或无与伦比的 HTML 标签 ;<text>元素包含多行输出。
这些选项是有用的当你不想要呈现的 HTML 元素作为输出的一部分。 @if(IsPost) { // Plain text followed by an unmatched HTML tag and server code. @: The time is:
<br /> @DateTime.Now <br/> // Server code and then plain text, matched tags, and more text. @DateTime.Now @:is the <em>current</em> time. } 如果你想要输出多行文本或无与伦比的 HTML 标记,您可以先于每行加@:,或您可以将行括在<text>元素。
像@:运算符 <text>标记由 ASP.NET 用于标识文本内容和从未呈现在页面输出中。 @if(IsPost) { // Repeat the previous example, but use <text> tags. <text> The time is: <br /> @DateTime.Now <br/> @DateTime.Now is the <em>current</em> time. </text> } @{ var minTemp = 75; <text>It is the month of @DateTime.Now.ToString("MMMM"), and it's a <em>great</em> day! <br /><p>You can go swimming if it's at least @minTemp degrees. </p></text> } 第一个示例重复前面的示例,但使用一对<text>标记括起来要呈现的文本。在第二个示例中, <text></text>标签将三个行,
都有一些百分之七十五的文本和无与伦比的 HTML 标记括起来 (<br />),
以及服务器代码和匹配的 HTML 标记。再次,你还之前可以单独地与每行@:运算符 ;无论哪种方式工作。 请注意当您输出文本中这一节所示 — — 使用 HTML 元素, @:运算符或
<text>元素 — — 不 ASP.NET 会进行 HTML 编码输出。
(如前所述,ASP.NET 不进行编码服务器代码表达式和服务器代码块前面有@,除了在此节中注意到的特殊情况下的输出)。

空白

在一份声明 (和外部字符串文本) 的多余空格不会影响该语句:

@{ var lastName =    "Smith"; }

在一份声明中的换行符并无影响的声明,你可以换行语句的可读性。下面的语句是相同的:

@{ var theName =
"Smith"; }

@{
    var
    personName
    =
    "Smith"
    ;
} 

但是,你不能换行在字符串文本中的行。下面的示例不起作用:

@{ var test = "This is a long
    string"; }  // Does not work!

若要组合的长字符串,换行到多行像上面的代码,有两个选项。您可以使用连接运算符 (+),你就会看到本文中稍后介绍的。
此外可以使用@字符来创建逐字的字符串文字,如你刚才在这篇文章中看到。您可以跨线中断逐字字符串: @{ var longString = @"This is a long string"; } 代码 (和标记) 的评论 评论让你为自己或他人留下注释。他们还允许您禁用 (注释掉) 一节的代码或标记,你不想运行,但想要在网页中暂时保留。 有不同评论剃刀代码和 HTML 标记的语法。与剃刀的所有代码,如剃刀评论处理 (,然后删除) 页发送到浏览器之前在服务器上。
因此,Razor 注释语法允许你将注释放在代码中 (或甚至到的标记),你可以看到当你编辑文件,但用户没有看到,即使在源页面中放。 为 ASP.NET 剃刀的评论,你开始的注释与@*和结束它与*@。评论可以是一行或多行上: @* A one-line code comment. *@ @* This is a multiline code comment. It can continue for any number of lines. *@ 这里是一个代码块中的注释: @{ @* This is a comment. *@ var theVar = 17; } 这里相同的代码块、 与代码行的注释掉这样就不会运行: @{ @* This is a comment. *@ @* var theVar = 17; *@ } 在代码块内,作为备用使用剃刀注释语法,您可以使用您使用的情况下,如 C# 编程语言的注释语法: @{ // This is a comment. var myVar = 17; /* This is a multi-line comment that uses C# commenting syntax. */ } 在 C# 中,单行注释前面有//字符和多行注释开始与/*和结束与*/。(与剃刀的评论,如 C# 的评论不会呈现到浏览器。) 对于标记,你可能知道,您可以创建 HTML 注释:
<!-- This is a comment. --> HTML 注释开始与<!--字符和结束与-->。您可以使用 HTML 注释包围不仅文本,而且还任何 HTML 标记,您可能希望将保持在页面中,
但不想呈现。此 HTML 注释将隐藏的标记和它们包含的文本的全部内容:
<!-- <p>This is my paragraph.</p> --> 与不同的剃刀呈现到页,评论,HTML 注释和,用户可以看到他们通过查看页面源代码。 变量 变量是一个命名的对象,你用来存储数据。您可以命名变量任何东西,但名称必须以字母字符开头,它不能包含空格或保留的字符。 变量和数据类型 变量可以具有特定的数据类型,它指示什么样的数据存储在该变量中。你可以有存储 (如"Hello world") 的字符串值的字符串变量,
整数变量存储整数值 (如 3 或 79) 和在各种格式 (如 2012/4/12 或 2009 年 3 月) 中存储日期值的日期变量。并且有许多您可以使用其他数据类型。 然而,你一般不需要指定变量的类型。大多数情况下,ASP.NET 可以计算出基于变量中的数据如何被使用的类型。(有时您必须指定一种类型 ; 您将看到的例子是如此)。 您声明一个变量 (如果你不想要指定一种类型) 使用var关键字或使用的类型的名称: @{ // Assigning a string to a variable. var greeting = "Welcome!"; // Assigning a number to a variable. var theCount = 3; // Assigning an expression to a variable. var monthlyTotal = theCount + 5; // Assigning a date value to a variable. var today = DateTime.Today; // Assigning the current page's URL to a variable. var myPath = this.Request.Url; // Declaring variables using explicit data types. string name = "Joe"; int count = 5; DateTime tomorrow = DateTime.Now.AddDays(1); } 下面的示例演示了在 web 页中的变量的一些典型用法: @{ // Embedding the value of a variable into HTML markup.
<p>@greeting, friends!</p> // Using variables as part of an inline expression. <p>The predicted annual total is: @( monthlyTotal * 12)</p> // Displaying the page URL with a variable. <p>The URL to this page is: @myPath</p> }

如果你结合前面的示例在页面中,您看到显示在浏览器中:

Razor-Img9

转换和测试数据类型

虽然 ASP.NET 通常可以自动确定数据类型,但有时它不能。因此,您可能需要帮助 ASP.NET 通过执行显式转换。即使你不需要类型转换,有时它是帮助进行测试,看什么类型的数据你可能工作与。

最常见的情况是你必须将字符串转换为另一种类型,如整数或日期。下面的示例演示一个典型的案例,必须将一个字符串转换为数字。

@{
    var total = 0;

    if(IsPost) {
        // Retrieve the numbers that the user entered.
        var num1 = Request["text1"];
        var num2 = Request["text2"];
        // Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt();
    }
}

作为一项规则,用户输入来到你作为字符串。即使您已经提示用户输入一个数字,即使他们输入了一个数字,当用户输入提交和你阅读它在代码中,数据是以字符串格式。因此,必须将该字符串转换为数字。在示例中,如果您尝试对值执行算术运算,而不会转换,以下错误结果,因为 ASP.NET 不能添加两个字符串:

不能隐式转换 string 向 int 类型。

若要将值转换为整数,你调用AsInt方法。如果转换成功,然后可以添加数字。

下表列出了一些常用的转换和测试方法的变量。

方法

说明

示例

AsInt(),
IsInt()

将转换为一个字符串,表示一个整数 (如"593") 为一个整数。

var myIntNumber =0;var myStringNum ="539";if(myStringNum.IsInt()==true){
    myIntNumber = myStringNum.AsInt();}

AsBool(),
IsBool()

将像"真实"或"假"的字符串转换为布尔值类型。

var myStringBool ="True";var myVar = myStringBool.AsBool();

AsFloat(),
IsFloat()

将转换为一个字符串,其十进制值像"1.3"或"7.439"到一个浮点数。

var myStringFloat ="41.432895";var myFloatNum = myStringFloat.AsFloat();

AsDecimal(),
IsDecimal()

将转换为一个字符串,其十进制值像"1.3"或"7.439"为十进制数。(在 ASP.NET 中,十进制数是一个浮点数比更为精确。

var myStringDec ="10317.425";var myDecNum = myStringDec.AsDecimal();

AsDateTime(),
IsDateTime()

转换到 ASP.NETDateTime类型表示的日期和时间值的字符串。

var myDateString ="12/27/2012";var newDate = myDateString.AsDateTime();

ToString()

将任何其他数据类型转换为一个字符串。

int num1 =17;int num2 =76;// myString is set to 1776string myString = num1.ToString()+
  num2.ToString();

运算符

运算符是命令的一个关键字或告诉 ASP.NET 什么样来执行在一个表达式中的字符。C# 语言 (和基于这个 Razor 语法) 支持许多经营者,但你只需要识别要开始的一小部分。下表总结了最常用的运算符。

运算符

说明

例子

+
-
*
/

在数值表达式中使用的数学运算符。

@(5 + 13)
@{ var netWorth = 150000; }
@{ var newTotal = netWorth * 2; }
@(newTotal / 2)

=

工作分配。将上的一份声明右侧的值分配给该对象的左侧。

var age =17;

==

平等。如果的值都相等,则返回true(注意=运算符和== = 运算符之间的区别。

var myNum =15;if(myNum ==15){// Do something.}

!=

不是平等。如果的值都不相等,则返回true

var theNum =13;if(theNum !=15){// Do something.}

<
>
<=
>=

少-比,
更大-比,
小于-或-等于,和
更大-比-或-平等。

if(2<3){// Do something.}var currentCount =12;if(currentCount >=12){// Do something.}

+

串联,用来连接字符串。ASP.NET 知道此运算符和加法运算符基于表达式的数据类型之间的区别。

// The displayed result is "abcdef".@("abc"+"def")

+=

-=

递增和递减运算符,其中添加和减去 1 (分别) 从一个变量。

int theCount =0;
theCount +=1;// Adds 1 to count

.

圆点。用于区分对象及其属性和方法。

var myUrl =Request.Url;var count =Request["Count"].AsInt();

()

括号。使用组表达式,并将参数传递给方法。

@(3 + 7)
@Request.MapPath(Request.FilePath);

[]

方括号。用于访问数组或集合中的值。

var income =Request["AnnualIncome"];

!

不是。反转true值为false ,反之亦然。通常用作测试为false的简写方法 (即,不是true).

bool taskCompleted =false;// Processing.if(!taskCompleted){// Continue processing}

&&

||

逻辑与和或,其中用于链接在一起的条件。

bool myTaskCompleted =false;int totalCount =0;// Processing.if(!myTaskCompleted && totalCount <12){// Continue processing.}

使用文件和文件夹路径中的代码

您经常会在您的代码中使用的文件和文件夹的路径。如它可能出现在您的开发计算机上,在这里是一个网站的物理文件夹结构的示例:

C:\WebSites\MyWebSite
    default.cshtml
    datafile.txt
    \images
        Logo.jpg
    \styles
        Styles.css

这里是一些基本和详细信息的 Url 路径:

  • 一个 URL 开头的域名 (http://www.example.com) 或一个服务器名称 (http://localhosthttp://mycomputer).
  • 一个 URL 对应于主机的计算机上的物理路径。例如, http://myserver可能对应于服务器上的C:\websites\mywebsite文件夹。
  • 虚拟路径是简写形式来表示代码中的路径,而无需指定完整的路径。它包括如下的域或服务器的名称 URL 的一部分。当你使用虚拟路径时,可以无需更新路径您的代码移到一个不同的域或服务器上。

下面是一个示例,以帮助您了解的区别:

完整的 URLhttp://mycompanyserver/humanresources/CompanyPolicy.htm
服务器名称mycompanyserver
虚拟路径/humanresources/CompanyPolicy.htm
物理路径C:\mywebsites\humanresources\CompanyPolicy.htm

虚拟根目录 /,就像根的 c: 驱动器是 \。(虚拟文件夹路径总是使用正斜杠。文件夹的虚拟路径不必具有相同的名称作为物理文件夹 ;它可以是一个别名。(在生产服务器上的虚拟路径的很少匹配精确的物理路径。

与文件和文件夹在代码中的工作时,有时您需要引用的物理路径和虚拟路径,具体取决于您正在使用什么对象有时。ASP.NET 为您提供这些工具用于处理代码中的文件和文件夹路径: Server.MapPath方法,和~运算符和Href方法。

将虚拟到物理路径转换: Server.MapPath 方法

Server.MapPath方法将虚拟路径 (如/default.cshtml) 转换为绝对物理路径 (如C:\WebSites\MyWebSiteFolder\default.cshtml)。你需要一个完整的物理路径的任何时间使用此方法。一个典型的例子是当你正在读取或写入一个文本文件或 web 服务器上的图像文件。

你通常不知道您的站点上承载网站的服务器的绝对物理路径,所以此方法可以将路径转换为你知道 — — 虚拟路径 — — 向为您的服务器上的相应路径。将虚拟路径传递到一个文件或文件夹的方法,和它返回的物理路径:

@{
    var dataFilePath = "~/dataFile.txt";
}
<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  -->
<p>@Server.MapPath(dataFilePath)</p>

引用虚拟根目录: ~ 运算符和 Href 方法

.cshtml.vbhtml文件中,您可以引用使用~运算符的虚拟根路径。这是极大的方便,因为您可以在一个站点上,来回移动网页和任何它们包含到其他页的链接不会被破坏。万一你过你的网站移动到一个不同的位置也很方便。这里是一些例子:

@{
    var myImagesFolder = "~/images";
    var myStyleSheet = "~/styles/StyleSheet.css";
}

如果网站是http://myserver/myapp,这里是在页运行时,ASP.NET 如何将对待这些路径:

  • myImagesFolder: http://myserver/myapp/images
  • myStyleSheet : http://myserver/myapp/styles/Stylesheet.css

(你不会看到这些路径作为该变量的值但 ASP.NET 会将路径视为那就是他们。

在 ASP.NET 网页中 2,您可以使用~运算符在服务器代码中 (如上所述) 并在标记中,像这样:

<!-- Examples of using the ~ operator in markup in ASP.NET Web Pages 2 -->
<!-- (Using the ~ operator like this in markup is not supported in ASP.NET
     Web Pages 1.0) -->

<a href="~/Default">Home</a>
<img src="~/images/MyImages.png" />

在标记中,您可以使用~运算符来创建资源 (如图像文件、 其他网页和 CSS 文件的路径。当页面运行时,ASP.NET 页 (代码和标记) 中查找和解析为适当的路径的所有~引用。

在 ASP.NET 网页中 1,可以在服务器代码块中,像上面的第一个示例使用~运算符。但为了在标记中使用它,您必须把里面对Href方法的调用~运算符。(ASP.NET 不分析通过寻找~运算符的标记)。

例如,可以在 HTML 标记中的Href方法使用<img>元素、 元素<link><a>元素的属性。请注意Href的方法前面的@ ,将它标记为服务器代码。此外请注意 Href的方法是,将属性值括起来的双引号内。

<!-- Examples of using the Href method in ASP.NET Web Pages 1.0 to include
     the ~ operator in markup. -->

<a href="@Href("~/Default")">Home</a>

<!-- This code creates the path "../images/Logo.jpg" in the src attribute. -->
<img src="@Href("~/images")/Logo.jpg" />

<!-- This creates a link to the CSS file using ther server variable. -->
<link rel="stylesheet" type="text/css" href="@Href(myStyleSheet)" />

条件逻辑和循环

ASP.NET 服务器代码允许您基于条件执行任务和写入特定次数的重复语句的代码 (就是运行一个循环的代码)。

测试条件

若要测试一个简单的条件你使用if语句,返回 true 或 false 基于您指定的测试:

@{
  var showToday = true;
  if(showToday)
  {
    @DateTime.Today;
  }
}

if关键字启动块。实际测试 (条件) 是在括号中,并返回 true 或 false。运行该测试是否属实的语句括在大括号中。if语句可以包括指定语句运行如果条件为 false 的else块:

@{
  var showToday = false;
  if(showToday)
  {
    @DateTime.Today;
  }
  else
  {
    <text>Sorry!</text>
  }
}

您可以添加多个条件使用else if块:

@{
    var theBalance = 4.99;
    if(theBalance == 0)
    {
        <p>You have a zero balance.</p>
    }
    else if (theBalance  > 0 && theBalance <= 5)
    {
        <p>Your balance of $@theBalance is very low.</p>
    }
    else
    {
        <p>Your balance is: $@theBalance</p>
    }
}

在此示例中,如果第一个条件,如果块不是 true,才会检查else if条件。如果满足这一条件,则执行else if块中的语句。
如果任何条件都不满足,则执行else块中的语句。如果块,然后关闭与else块作为"别的事情"条件,你可以添加任意数量的其他。 若要测试大量的条件,请使用switch块: @{ var weekday = "Wednesday"; var greeting = ""; switch(weekday) { case "Monday": greeting = "Ok, it's a marvelous Monday"; break; case "Tuesday": greeting = "It's a tremendous Tuesday"; break; case "Wednesday": greeting = "Wild Wednesday is here!"; break; default: greeting = "It's some other day, oh well."; break; }
<p>Since it is @weekday, the message for today is: @greeting</p> } 要测试的值是 (在该示例中,weekday变量) 中括号。每个单独测试使用case语句,以冒号 (:)。
如果一个case语句的值与测试值相匹配,则执行该案例的块中的代码。每个 case 语句,用break语句,您关闭。
(如果您忘记了要在每个case块包括休息下, 一个case语句中的代码将运行也。
switch块通常具有default的语句作为最后一种情况为"别的事情"选项运行如果的其他情况下都不为真。

在浏览器中显示的最后两个条件块的结果:

Razor-Img10

循环代码

你经常需要重复运行相同的语句。你这样的循环。例如,您经常运行相同的语句为每个项目中的数据的集合。如果你知道确切地多少次你想要循环,您可以使用for循环。这种循环是计数或倒计时特别有用:

@for(var i = 10; i < 21; i++)
{
    <p>Line #: @i</p>
}

循环开头for关键字后, 跟由三个语句在括号中,每个用分号终止。

  • 在括号内的第一个语句 (var i=10;) 创建一个计数器,并将它初始化为 10。你不需要计数器i的名字 — — 您可以使用任何变量。for循环运行时,计数器会自动递增。
  • 第二个语句 (i < 21;) 设置多远您要计数的条件。在这种情况下,你想让它去最大限度地 20 (就继续前进时,计数器值小于 21)。
  • 第三个语句 (i++ ) 使用递增运算符,只需指定计数器应该有 1 添加到它每次循环运行的时。

大括号内是会为每个循环迭代中运行的代码。标记每次创建一个新的段落 (<p>元素),并将行添加到输出中,显示的i(计数器) 值。当您运行此页时,该示例创建 11 行显示的输出,与每个指示物料编号的行中的文本。

Razor-Img11

 

如果您正在处理集合或数组,您经常使用foreach循环。集合是一组相似对象和foreach循环允许您执行一个任务上每个集合中的项。这种类型是循环的方便的集合,因为与不同的for循环,你不需要增加计数器的值或设置的限制。相反, foreach循环代码简单地通过所得集合直到它完成。

例如,下面的代码返回项在Request.ServerVariables集合中,它是一个对象,包含有关您的 web 服务器的信息。它使用foreach 循环来显示每个项的名称,通过在 HTML 项目符号列表中创建一个新的<li>元素。

<ul>
@foreach (var myItem in Request.ServerVariables)
{
    <li>@myItem</li>
}
</ul>

foreach关键字是后接括号位置您声明一个变量,它表示 (在示例中, var item) 集合中的单个项目,其次是in关键字,其次是要依次通过的集合。foreach循环的正文中,您可以访问使用之前声明该变量的当前项。

Razor-Img12

若要创建更多的普通的循环,使用while的发言:

@{
    var countNum = 0;
    while (countNum < 50)
    {
        countNum += 1;
        <p>Line #@countNum: </p>
    }
}

while循环的开头while关键字后, 跟的圆括号,您指定多长时间循环继续 (这里,为,只要countNum是少于 50),然后要重复的块。循环通常递增 (添加到) 或递减 (从减去) 变量或对象用于盘点。在示例中, += = 运算符将 1 添加到countNum每次循环运行。(要递减计数下一个循环中的变量,请使用递减运算符-=).

对象和集合

几乎一切在 ASP.NET 网站是一个对象,其中包括 web 页本身。本节讨论一些重要的对象,您将在您的代码中使用频繁。

页面对象

在 ASP.NET 中的最基本的对象是的页面。您可以访问页对象直接无任何限定的对象的属性。下面的代码获取页面的文件路径,使用页面的Request对象:

@{
    var path = Request.FilePath;
}

使其明确您要引用的属性和当前的页面对象上的方法,你可以选择使用关键字this来代表您的代码中的页面对象。这里是前面的代码示例,与this添加的用于表示页面:

@{
    var path = this.Request.FilePath;
}

Page对象的属性可用于获取大量的信息,如:

  • Request你已经看到,这是有关当前请求,包括什么类型的浏览器提出请求的 URL 的页面、 用户身份等信息的集合。
  • Response这是信息的有关服务器代码运行完毕时将发送到浏览器的响应 (页) 的集合。例如,您可以使用此属性将信息写入到响应。
    @{
        // Access the page's Request object to retrieve the Url.
        var pageUrl = this.Request.Url;
    }
    <ahref="@pageUrl">My page</a>

集合对象 (数组和字典)

集合是类型的一组相同,如Customer从一个数据库对象的集合的对象。ASP.NET 包含许多内置的集合,像Request.Files集合。

您会经常使用的集合中的数据。两个常用的集合类型是数组字典当您想要存储的类似项目的集合,但不想要创建一个单独的变量来保存每个项目时,数组很有用:

@* Array block 1: Declaring a new array using braces. *@
@{
    <h3>Team Members</h3>
    string[] teamMembers = {"Matt", "Joanne", "Robert", "Nancy"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

与数组声明特定的数据类型,如stringintDateTime为了指示该变量可包含一个数组,您需要在声明中添加方括号(例如 string[]int[])。您可以访问数组使用其位置 (索引) 中或通过使用foreach语句的项。数组索引是从零开始 — — 也就是说,第一个项目是在位置 0,第二项是在位置 1,依此类推。

@{
    string[] teamMembers = {"Matt", "Joanne", "Robert", "Nancy"};
    <p>The number of names in the teamMembers array: @teamMembers.Length </p>
    <p>Robert is now in position: @Array.IndexOf(teamMembers, "Robert")</p>
    <p>The array item at position 2 (zero-based) is @teamMembers[2]</p>
    <h3>Current order of team members in the list</h3>
    foreach (var name in teamMembers)
    {
        <p>@name</p>
    }
    <h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers);
    foreach (var reversedItem in teamMembers)
    {
        <p>@reversedItem</p>
    }
}

您可以通过获取其Length属性来确定数组中的项的数目。若要获取某个特定项的数组 (可以搜索数组) 中的位置,请使用Array.IndexOf方法。你也可以做事情像反向数组 ( Array.Reverse方法) 的内容或排序内容 ( Array.Sort方法)。

在浏览器中显示的字符串数组代码的输出:

Razor-Img13

字典是键/值对的集合,您可以通过提供键值 (或名称) 来设置或检索相应的值:

@{
    var myScores = new Dictionary<string, int>();
    myScores.Add("test1", 71);
    myScores.Add("test2", 82);
    myScores.Add("test3", 100);
    myScores.Add("test4", 59);
}
<p>My score on test 3 is: @myScores["test3"]%</p>
@(myScores["test4"] = 79)
<p>My corrected score on test 4 is: @myScores["test4"]%</p>

若要创建一个字典,您使用new关键字来指示您要创建一个新的字典对象。您可以使用 var 关键字来给变量分配一个字典。您可以使用尖括号 ( < > ) 来指明字典中的项的数据类型。在声明的末尾,您必须添加一对圆括号,因为这实际上是一个方法,用于创建一个新的字典。

要将项目添加到字典中,可以调用Add方法的字典变量 (在本例中为myScores ),然后指定一个键和值。或者,您可以使用方括号来指示键和做简单的赋值,如下面的示例:

myScores["test4"]=79;

要从字典中获取值,您需要在括号中指定键值:

var testScoreThree = myScores["test3"];

调用带参数的方法

当您阅读本文中前面,你程序可以与对象有方法。例如,一个Database对象可能有Database.Connect的一种方法。很多方法也有一个或多个参数。参数是传递给方法的值以使该方法以完成其任务。例如,看看的Request.MapPath方法,采用三个参数的声明:

publicstringMapPath(string virtualPath,string baseVirtualDir,bool allowCrossAppMapping);

(线已经经过包装,使它更具可读性。请记住您可以将的换行符几乎任何地方除了里面的字符串,用引号括起来.)

此方法返回的物理路径相对应的服务器上的指定虚拟路径。virtualPathbaseVirtualDirallowCrossAppMapping这三个参数的方法。(请注意,在声明中会列出参数以及它们所接受的数据的数据类型。)当调用此方法时,您必须提供所有三个参数的值。

Razor 语法,可以将参数传递给方法的两个选项:定位参数命名参数调用使用位置参数的方法,您在方法声明中指定的严格顺序传递参数。(你会通常知道此订单通过读取文件的方法。您必须遵循该顺序,并且不能跳过任何参数 —— 如果有必要,您可以向没有值的位置参数传递一个空字符串 ("") 或 null

下面的示例假定您有一个名为的脚本在您的网站文件夹。该代码调用Request.MapPath方法,并按正确的顺序传递三个参数的值。然后,它显示生成的映射的路径。

@{
    // Pass parameters to a method using positional parameters.
    var myPathPositional = Request.MapPath("/scripts", "/", true);
}
<p>@myPathPositional</p>

当某个方法具有多个参数时,可以让你的代码更具可读性通过使用命名的参数。要调用的方法使用命名的参数,请指定参数名称后面跟一个冒号 (:),然后值。命名参数的好处是你可以通过它们在任何你想要的顺序。(缺点是方法调用不是紧凑。

下面的示例调用相同的方法上面,但使用命名参数来提供值:

@{
    // Pass parameters to a method using named parameters.
    var myPathNamed = Request.MapPath(baseVirtualDir: "/", 
        allowCrossAppMapping: true, virtualPath: "/scripts");
}
<p>@myPathNamed</p>

正如您所看到的是按不同的顺序传递参数。但是,如果您运行前面的示例,此示例中,他们就会返回相同的值。

处理错误

Try Catch 语句

你经常会在您可能失败原因你控制范围之外的代码语句。例如:

  • 如果您的代码尝试创建或访问文件时,可能会出现各种各样的错误。你想要的文件可能不存在,它可能已被锁定,代码可能不具有的权限,等等。

  • 同样,如果您的代码尝试更新数据库中的记录,可以有权限问题,与数据库的连接可能被丢弃,要保存的数据可能是无效的等等。

在编程术语中,这种情况被称为异常如果您的代码遇到的异常,它将生成 (投掷) 一条错误消息,充其量,恼人的用户:

Razor-Img14

在哪里,您的代码可能会遇到的例外情况的情况下,为了避免这种类型的错误消息,您可以使用try/catch语句。try语句,在你运行的代码,你在检查。在一个或多个catch语句,您可以查找特定于可能发生的错误 (特定类型的异常)。您可以包括尽可能多的catch语句,您需要查找你预计的错误。

请注意我们建议您避免使用Response.Redirect方法中的try/catch语句,因为它可以在您的页面中会导致异常。

下面的示例演示创建一个文本文件在首次请求,然后显示一个按钮,使用户可以打开该文件的页面。该示例故意使用错误的文件的名称,这样,它将导致异常。守则中包括的两个可能异常的catch语句: FileNotFoundException,其中发生如果文件的名称是坏和DirectoryNotFoundException,其中发生如果 ASP.NET 甚至找不到该文件夹。(您可以取消对示例中的语句,看它如何运行时一切工作正常。)

如果您的代码不处理异常,你会看到错误页面 (如前面的屏幕快照。然而, try/catch节可以帮助防止用户看到这些类型的错误。

@{
    var dataFilePath = "~/dataFile.txt";
    var fileContents = "";
    var physicalPath = Server.MapPath(dataFilePath);
    var userMessage = "Hello world, the time is " + DateTime.Now;
    var userErrMsg = "";
    var errMsg = "";

    if(IsPost)
    {
        // When the user clicks the "Open File" button and posts
        // the page, try to open the created file for reading.
        try {
            // This code fails because of faulty path to the file.
            fileContents = File.ReadAllText(@"c:\batafile.txt");

            // This code works. To eliminate error on page,
            // comment the above line of code and uncomment this one.
            //fileContents = File.ReadAllText(physicalPath);
        }
        catch (FileNotFoundException ex) {
            // You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message;
            // Create a friendly error message for users.
            userErrMsg = "A file could not be opened, please contact "
                + "your system administrator.";
        }
        catch (DirectoryNotFoundException ex) {
            // Similar to previous exception.
            errMsg = ex.Message;
            userErrMsg = "A directory was not found, please contact "
                + "your system administrator.";
        }
    }
    else
    {
        // The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage);
    }
}

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Try-Catch Statements</title>
    </head>
    <body>
    <form method="POST" action="" >
      <input type="Submit" name="Submit" value="Open File"/>
    </form>

    <p>@fileContents</p>
    <p>@userErrMsg</p>

    </body>
</html>
 

转载于:https://www.cnblogs.com/xust/articles/3308329.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值