深入理解ASP.NETCoreMVC中的Razor视图及相关特性
立即解锁
发布时间: 2025-08-25 01:04:40 阅读量: 2 订阅数: 8 

### 深入理解ASP.NET Core MVC中的Razor视图及相关特性
#### 1. 理解Razor视图
ASP.NET Core MVC使用Razor语言来定义视图中的HTML模板。Razor视图文件会在首次使用、应用程序构建或发布时编译成.NET类。默认情况下,每次构建和发布时都会进行预编译,但可以通过在Web应用程序项目文件中添加以下代码来更改此行为:
```xml
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<!-- add code below -->
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
<!-- end of code to add -->
...
</PropertyGroup>
```
视图也可以通过选择Razor视图库项目预编译到视图库中。编译后,视图仍与其路径相关联,路径成为其完整名称。每个控制器在“Views”文件夹下都有一个同名的关联文件夹,该文件夹应包含该控制器使用的所有视图。控制器通过“View”方法引用视图时,使用不带`.cshtml`扩展名的路径。如果路径以`/`开头,则被解释为相对于应用程序根目录;否则,首先解释为相对于控制器关联的文件夹,如果未找到视图,则在“Shared”文件夹中搜索。
例如,在`HomeController`中可以这样引用`Privacy.cshtml`视图:
```csharp
View("Privacy", MyViewModel);
```
如果视图名称与操作方法名称相同,则可以简化为:
```csharp
View(MyViewModel);
```
Razor视图是HTML代码、C#代码和一些Razor特定语句的混合。每个视图都以一个头部开始,其中包含视图预期接收的ViewModel类型:
```razor
@model MyViewModel
```
每个视图还可以包含一些`using`语句,其效果与标准代码文件中的`using`语句相同:
```razor
@model MyViewModel
@using MyApplication.Models
```
在`_ViewImports.cshtml`文件(位于“Views”文件夹的根目录)中声明的`using`语句会自动应用于所有视图。每个视图还可以在其头部使用以下语法从DI引擎请求类型的实例:
```razor
@model MyViewModel
@using MyApplication.Models
@inject IViewLocalizer Localizer
```
视图的其余部分是C#代码、HTML和Razor控制流语句的混合。视图的每个区域可以处于HTML模式或C#模式。处于HTML模式的视图区域中的代码被解释为HTML,而处于C#模式的视图区域中的代码被解释为C#。
#### 2. 学习Razor控制流语句
如果想在HTML区域中编写C#代码,可以使用`@{..}`控制流Razor语句创建一个C#区域,示例如下:
```razor
@{
//place C# code here
var myVar = 5;
...
<div>
<!-- here you are in HTML mode again -->
...
</div>
//after the HTML block you are still in C# mode
var x = "my string";
}
```
上述示例表明,在C#区域中编写一个HTML标签就可以创建一个HTML区域,反之亦然。HTML标签关闭后,又会回到C#模式。
C#代码不产生HTML,而HTML代码按其出现的顺序添加到响应中。在HTML模式下,可以通过在任何C#表达式前加上`@`来添加用C#代码计算的文本。如果表达式很复杂,由一系列属性和方法调用组成,则必须用括号括起来。以下是一些示例:
```razor
<span>Current date is: </span>
<span>@DateTime.Today.ToString("d")</span>
...
<p>
User name is: @(myName+ " "+mySurname)
</p>
...
<input type="submit" value="@myUserMessage" />
```
类型会使用当前文化设置转换为字符串。此外,字符串会自动进行HTML编码,以避免`<`和`>`符号干扰视图HTML。可以使用`@HTML.Raw`函数防止HTML编码:
```razor
@HTML.Raw(myDynamicHtml)
```
在HTML区域中,可以使用`@if`Razor语句选择替代HTML:
```razor
@if(myUser.IsRegistered)
{
//this is a C# code area
var x=5;
...
<p>
<!-- This is an HTML area -->
</p>
//this is a C# code area again
}
else if(callType == CallType.WebApi)
{
...
}
else
{
..
}
```
可以使用`for`、`foreach`和`while`Razor语句多次实例化HTML模板,示例如下:
```razor
@for(int i=0; i< 10; i++)
{
}
@foreach(var x in myIEnumerable)
{
}
@while(true)
{
}
```
请注意,这些语句是Razor特定的语句,虽然语法与标准C#对应语句相似,但不要混淆。
Razor视图可以包含不生成任何代码的注释。任何包含在`@*...*@`内的文本都被视为注释,在页面编译时会被删除。
#### 3. 理解Razor视图属性
每个视图中预定义了一些标准变量:
- **Model**:包含传递给视图的ViewModel。例如,如果将`Person`模型传递给视图,则`<span>@Model.Name</span>`会显示传递给视图的`Person`的姓名。
- **ViewData**:包含`IDictionary<string, object>`,与调用视图的控制器共享。即所有控制器也有一个`ViewData`属性,其中包含`IDictionary<string, object>`,在控制器中设置的每个条目在被调用视图的`ViewData`变量中也可用。`ViewData`是控制器向其调用的视图传递信息的另一种方式。
- **User**:包含当前登录的用户,即当前请求的`Http.Context.User`属性中包含的同一实例。
- **Url**:包含`IUrlHelper`接口的实例,其方法用于计算应用程序页面的URL。例如,`Url.Action("action", "controller", new {par1=valueOfPar1,...})`计算调用控制器的`action`方法的URL,并传递匿名对象中指定的所有参数。
- **Context**:包含整个请求的`HttpContext`。
- **ViewContext**:包含有关视图调用上下文的数据,包括调用视图的操作方法的元数据。
#### 4. 使用Razor标签助手
在ASP.NET Core MVC中,开发人员可以定义所谓的标签助手,这些标签助手可以用新的标签属性增强现有HTML标签,或者定义新标签。在编译Razor视图时,任何标签都会与现有的标签助手进行匹配。找到匹配项时,源标签会被标签助手创建的HTML替换。可以为同一个标签定义多个标签助手,它们的执行顺序可以通过与每个标签助手关联的优先级属性进行配置。
所有为同一标签定义的标签助手在处理每个标签实例时可以进行协作,因为它们会传递一个共享的数据结构,每个标签助手都可以在其中做出贡献。通常,最后调用的标签助手会处理这个共享数据结构以生成输出HTML。
标签助手是继承自`TagHelper`类的类。要使用标签助手,必须使用以下声明声明包含它的`.dll`文件:
```razor
@addTagHelper *, Dll.Complete.Name
```
如果只想使用`.dll`文件中定义的一个标签助手,则必须将`*`替换为标签名称。
上述声明可以放在使用库中定义的标签助手的每个视图中,也可以一次性放在`_ViewImports.cshtml`文件(位于“Views”文件夹的根目录)中。默认情况下,`_ViewImports.cshtml`使用以下声明添加所有预定义的ASP.NET Core MVC标签助手:
```razor
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
```
以下是一些常见标签助手的应用:
- **锚标签**:通过属性增强,可自动计算URL并调用具有给定参数的特定操作方法:
```razor
<a asp-controller="{controller name}"
asp-action="{action method name}"
asp-route-{action method parameter1}="value1"
...
asp-route-{action method parametern}="valuen">
put anchor text her
```
0
0
复制全文
相关推荐










