asp.net core系列 41 Web 应用 MVC视图
一.MVC视图
在Web开发的MVC和Razor中,都有使用视图,在Razor中称为"页"。.cshtml视图是嵌入了Razor标记的HTML模板。 Razor 标记使用C#代码,用于与HTML 标记交互以生成发送给客户端的网页。在MVC目录结构中,Views / [ControllerName] 文件夹下用于创建视图,其中Views/Shared 文件夹下的视图是控制器共享的视图。
1.1 视图页Razor 标记
下面是Views/Home 文件夹中创建一个 About.cshtml 文件,呈现的视图如下:
@{
ViewData["Title"] = "About";
}
<h2>@ViewData["Title"].</h2>
<h3>@ViewData["Message"]</h3>
Razor 标记以 @ 符号开头。后面的大括号 { ... } 括住的是 Razor 代码块,是运行 C# 语句。 只需用 @
符号来引用值,即可在 HTML 中显示这些值。比如上面h2和h3标签。
1.2 控制器指定视图
通常以 ViewResult 的形式从Action返回结果到视图,这是一种 ActionResult结果类型(Web api中有讲到)。但通常不会这样做。 因为大多数控制器均继承自Controller,因此只需使用 View 方法即可返回 ViewResult。示例如下:
public IActionResult About()
{
ViewData["Message"] = "Your application description page."; return View();
}
View
方法有多个重载。 可选择指定:
//要返回的显式视图
return View("Orders");
//要传递给视图的模型(实体)对象
return View(Orders);
//视图和模型
return View("Orders", Orders);
1.3 视图发现
Action返回一个视图时, 这个过程叫“视图发现”。默认的 return View();
将返回与当前Action方法同名的视图。搜索匹配的视图文件顺序规则如下:
Views/[ControllerName]/[ViewName].cshtml
Views/Shared/[ViewName].cshtml
当return View()
时,首先在 Views/[ControllerName] 文件夹中搜索该视图。 如果在此处找不到匹配的视图,则会在“Shared”文件夹中搜索该视图。
在返回视图时,可以提供视图文件路径。 如果使用绝对路径(“/”或“~/”开头),必须指定 .cshtml 扩展名:
return View("Views/Home/About.cshtml");
也可使用相对路径在不同目录中指定视图,而无需指定 .cshtml 扩展名:
return View("../Manage/Index");
可以用“./”前缀来指示当前的控制器特定目录:
return View("./About");
1.4 向视图传递数据
可以使用多种方法将数据传递给视图。包括:(1)强类型数据:viewmodel。(2)弱类型数据ViewData (ViewDataAttribute)、ViewBag。ViewBag
在 Razor 页中不可用。
(1) 强类型数据 viewmodel
在传递数据到视图中,最可靠的是使用强类型数据,因为编译时能检查并且有智能感知。在视图页中使用@model指令来指定模型(可以是实体或集合泛型实体)。如下所示,其中前端的WebApplication1.ViewModels.Address是实体类命令空间,通过后端返回view强类型映射:
@model WebApplication1.ViewModels.Address
<h2>Contact</h2>
<address>
@Model.Street<br>
@Model.City, @Model.State @Model.PostalCode<br>
<abbr title="Phone">P:</abbr> 425.555.0100
</address>
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page."; var viewModel = new Address()
{
Name = "Microsoft",
Street = "One Microsoft Way",
City = "Redmond",
State = "WA",
PostalCode = "98052-6399"
}; //返回强类型
return View(viewModel);
}
(2) 弱类型数据(ViewData、ViewData 属性和 ViewBag)
视图还可以访问弱类型(也称为松散类型)的数据集合。可以使用弱类型数据集合将少量数据传入及传出控制器和视图。ViewData
属性是弱类型对象的字典。ViewBag
属性是 ViewData
的包装器,为基础 ViewData
集合提供动态属性。ViewData派生自 ViewDataDictionary,ViewBag派生自 DynamicViewData。
ViewData
和 ViewBag
在运行时进行动态解析。 由于它们不提供编译时类型检查,因此使用这两者通常比使用 viewmodel 更容易出错。建议尽量减少或根本不使用 ViewData
和 ViewBag
。
ViewData介绍
下面是一个ViewData存储对象,在视图上强制转换为特定类型(Address)。
public IActionResult SomeAction()
{
ViewData["Greeting"] = "Hello";
ViewData["Address"] = new Address()
{
Name = "Steve",
Street = "123 Main St",
City = "Hudson",
State = "OH",
PostalCode = ""
}; return View();
}
@{
// Since Address isn't a string, it requires a cast.
var address = ViewData["Address"] as Address;
} @ViewData["Greeting"] World! <address>
@address.Name<br>
@address.Street<br>
@address.City, @address.State @address.PostalCode
</address>
ViewData 特性介绍
可以在控制器或 Razor 页面模型上,使用 [ViewData]
修饰属性。下面是一个示例:
public class HomeController : Controller
{
[ViewData]
public string Title { get; set; } public IActionResult About()
{
Title = "About Us";
ViewData["Message"] = "Your application description page."; return View();
}
}
//通过字典key取出
<title>@ViewData["Title"] - WebApplication</title>
ViewBag介绍
ViewBag
不需要强制转换,因此使用起来更加方便。下面示例如下:
public IActionResult SomeAction()
{
// Greeting不需要先声明,Address 也一样,因为是Dynamic类型
ViewBag.Greeting = "Hello";
ViewBag.Address = new Address()
{
Name = "Steve",
Street = "123 Main St",
City = "Hudson",
State = "OH",
PostalCode = ""
}; return View();
}
@ViewBag.Greeting World! <address>
@ViewBag.Address.Name<br>
@ViewBag.Address.Street<br>
@ViewBag.Address.City, @ViewBag.Address.State @ViewBag.Address.PostalCode
</address>
更多视图功能包括:标记帮助程序、服务注入视图,视图组件等
参考文献
asp.net core系列 41 Web 应用 MVC视图的更多相关文章
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- asp.net core系列 42 Web 应用 分部视图
一.分部视图 对于MVC 视图和 Razor Pages 页面,都有分部视图功能.通常将 MVC 视图和 Razor Pages 页面统称为“标记文件”,下面会常提到该名词.使用分部视图的优势包括:( ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- asp.net core系列 44 Web应用 布局
一.概述 MVC的视图与Razor页面经常共享视觉和程序元素,通过使用布局来完成,布局还可减少重复代码.本章演示了以下内容的操作方法:(1)使用通用布局,(2)自定义布局,(3) 共享指令,(4)在呈 ...
- asp.net core系列 43 Web应用 Session分布式存储(in memory与Redis)
一.概述 HTTP 是无状态的协议. 默认情况下,HTTP 请求是不保留用户值或应用状态的独立消息. 本文介绍了几种保留请求间用户数据和应用状态的方法.下面以表格形式列出这些存储方式,本篇专讲Sess ...
- asp.net core系列 67 Web压力测试工具WCAT
一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的压力测试.Web Capacity Analysis Tool (Wcat)是一种轻量级HTTP负载生成工具,主要用于衡量受控环境中 ...
- asp.net core系列 45 Web应用 模型绑定和验证
一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...
随机推荐
- MDK的一些小应用
一:MDK生成bin文件 Options(魔术棒) -> User -> After Build/rebuild -> Run#1(前边打钩) (后边的方框输入一段内容) ...
- dotnetcore http服务器研究(二)性能分析
Asp.net core kestrel 服务器性能分析 因近来发现neocli 使用asp.net core kestrel 服务器提供rpc调用,性能比较低. 和以前做过测试差异比较大,故而再次测 ...
- oracle主键和索引
主键:能够唯一标识一条记录的字段为主键(亦或主码),不能重复的,不允许为空.作用:用来保证数据完整性个数:主键只能有一个 索引:作用:是提高查询排序的速度个数:一个表可以有多个索引 常用索引类型:No ...
- Python3 类和继承和组合
import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) ...
- 意识科学初步:David Chalmers的简单问题与困难问题
这是第一篇关于意识科学的内容.主要谈一下阅读大卫查莫斯的几篇论文的一些观点和思考. 论文作者简介(摘自wiki): David John Chalmers (born 20 April 1966) i ...
- Cocos2d-js和Android交互
说白了,就是JavaScript和Java之间的函数互相调用. 先看一下效果 有了这个交互,为了以后接sdk做准备. 要点: javascript调用java: jsb.reflection.call ...
- 洛谷p3799:妖梦切木棒
题意:任选四段木板拼正三角形 因为是正三角形 所以我们可以想到至少是两个相同的,剩下两个拼成最后一条边 我们只需要枚举边长即可 那么我们对每次读入的x,使他的cnt++ 考虑用一个二重循环 外层枚举边 ...
- Linux用命令启动程序(eclipse、IDEA等)
打开根目录用管理员权限打开HOME 找到下图截图中的框选出的文件 用文本编辑器打开后 在文件末尾添加所需要打开的应用文件所在的目录 这里以本人的IDEA和eclipse为例:
- React的类型检测PropTypes
React.propTypes:React.PropTypes 提供很多验证器来验证传入数据的有效性,当向props传入无效数据时,JavaScript 控制台会抛出警告. ; class MyTit ...
- web项目如何使用Material Icons
使用文档链接 图标库 最简单的使用方法 引入 <link href="https://fonts.googleapis.com/icon?family=Material+Icons&q ...