《精通 ASP.NET MVC 4》----2.3 渲染Web页面

简介: 前面例子的输出并不是HTML,只是一个字符串“Hello, world”。为了产生一个对浏览器请求进行响应的HTML,需要创建一个视图(View)。

本节书摘来自异步社区《精通 ASP.NET MVC 4》一书中的第2章,第2.3节,作者: 【美】Adam Freeman ,译者: 李萍 , 徐燕萍 , 林逸 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 渲染Web页面

精通 ASP.NET MVC 4
前面例子的输出并不是HTML,只是一个字符串“Hello, world”。为了产生一个对浏览器请求进行响应的HTML,需要创建一个视图(View)。

2.3.1 创建并渲染视图

要做的第一件事是修改Index动作方法,如清单2-3所示。

清单2-3 修改控制器以渲染一个视图

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace PartyInvites.Controllers {
    public class HomeController : Controller {
        public **ViewResult** Index() {
            return **View()**;
        }
    }
}

清单2-3中的改动以黑体显示。当从一个动作方法返回一个ViewResult对象时,便是在指示MVC去渲染一个视图。通过调用不带参数的View方法来创建这个ViewResult对象。这是告诉MVC——去渲染该动作的默认视图。

如果此时运行这个应用程序,就可以看到MVC框架正试图查找要使用的默认试图,并显示图2-8所示的错误消息。

这个错误消息是很有帮助的,它不仅解释了MVC未找到该动作方法的视图,而且还显示出它查找了哪些地方。这是MVC约定的另一个很好的例子:视图是通过命名约定与动作方法相关联的。这个动作方法叫作“Index”,控制器叫作“Home”。从图2-8中可以看出,MVC试图在“Views”文件夹中查找有这个名字的不同文件。

为了创建一个视图,停止调试器,右击HomeController.cs代码文件中的动作方法(在方法名上,或在方法体内),从弹出菜单选择“添加视图”,打开“添加视图”对话框,如图2-9所示。

去掉“Use a layout or master page(使用布局或母版页)”复选框。本例不使用布局,但读者将在第7章看到布局的使用。点击“Add(添加)”按钮,Visual Studio将在Views/Home文件夹中创建一个名为“Index.cshtml”的视图文件。如果回看刚才图2-8显示的错误消息,就会发现这个新文件是MVC试图寻找的文件之一。

提示:.cshtml文件扩展名表示是一个由Razor处理的C#视图。MVC的早期版本建立在ASPX视图引擎之上,其视图文件扩展名为.aspx。
Visual Studio打开Index.cshtml文件以便编辑。读者将看到该文件主要含有HTML。不同的是,会看到类似下面的部分。


e56754b58e46bfae36abd9750bd91661bccf955a
@{
    Layout = null;    
}

这是一个由Razor视图引擎来解释的代码块。这是一个相当简单的例子。它只是告诉Razor并未选用布局(此刻略去Razor,稍后再回头讨论)。现在,将清单2-4所示的黑体内容添加到Index.cshtml文件中。

清单2-4 添加到视图的HTML


eb921478af4fb32477efef1b4c7608b60016f839

这一添加显示了另一种简单消息(用HTML标记显示出来的消息,而不是前面那种由动作方法显示的字符串消息——译者注)。从“Debug(调试)”菜单选择“Start Debugging(开始调试)”来运行该应用程序,并测试此视图。读者可以看到类似于图2-10所示的内容。


6d16bd21f49a6e54bb60830ff8c765af55b80ca2

在最初创建Index动作方法时,它返回了一个字符串值。这意味着,MVC除了把这个字符串传递给浏览器之外,未做其他事情。现在,Index方法返回了一个ViewResult,这是指示MVC渲染一个视图并返回HTML。清单2-4并未告诉MVC应该使用哪个视图,其实它运用了命名约定,以自动找到一个视图。这个约定是,视图具有动作方法的名字,并位于以控制器命名的文件夹之中——~/Views/Home/Index.cshtml。

除了字符串和ViewResult对象之外,还可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,可以使浏览器被重定向到另一个URL。如果返回一个HttpUnauthorizedResult,会强迫用户进行登录。这些对象统称为动作结果(Action Result),而且它们都是从ActionResult类派生而来的。动作结果系统使开发者能够封装并重用动作中的常用响应。随着本书的进展,将介绍更多内容,并演示一些复杂的运用。

2.3.2 添加动态输出

一个Web应用程序平台的全部目标是构造并显示动态输出。在MVC中,控制器的工作是构造一些数据,并将其传递给视图,而视图负责把它渲染成HTML。

注意:现在,有很多人都把“渲染”说成“呈现”,其实这种说法是不正确的。Web页面从服务器到浏览器的整个呈现过程实际上分为三步。第一步是通过视图引擎对视图文件进行解析,将视图文件中的代码转换成HTML标记,这一步叫作渲染。第二步是将渲染后的HTML标记传递给客户端浏览器,这一步是页面的传递。第三步是浏览器接收到HTML后对其进行处理并呈现为Web页面,这一步才叫作呈现。由此可见,渲染是把页面的非HTML代码(控件、页面代码等)转换成HTML标记,这一步工作是由服务器完成的。而呈现是将HTML显示成Web页面,这一步工作是由浏览器完成的。渲染和呈现是整个页面处理过程的两个不同阶段,更不能把这两步工作混谈为只有“呈现”这么一步——译者注
把数据从控制器传递给视图的一种方式是使用ViewBag(视图包)对象,它是Controller基类的一个成员。ViewBag是一种动态对象,可以给它赋任意属性,使这些属性的值在随后渲染的视图中可用。清单2-5演示了在HomeController.cs文件中以这种方式传递一些简单的动态数据。

清单2-5 设置一些视图数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace PartyInvites.Controllers {
    public class HomeController : Controller {
        public ViewResult Index() {
**int hour = DateTime.Now.Hour;**
**ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";**
            return View();
        }
    }
}

将一个值赋给ViewBag.Greeting属性时,便是为视图提供数据。ViewBag是一种动态对象,Greeting属性直到给其赋值的那一刻才会存在——这让用户能够以自如而流畅的方式将数据从控制器传递给视图,而不必提前定义类。

在视图中再次查阅ViewBag.Greeting属性,便可获得其数据值,正如清单2-6所演示的那样,它显示了对Index.cshtml文件所做的修改。

清单2-6 接收ViewBag的数据值


25287a0873c68ee83b4c1e703f80e4c7f930e301

添加到清单2-6的是一个Razor表达式。当人们在控制器的Index方法中调用View方法时,MVC框架会定位Index.cshtml视图文件,并要求Razor视图引擎解析该文件的内容。Razor会寻找类似于在该清单中所添加的这种表达式,并处理它们。在此例中,处理该表达式意味着,在视图中插入在动作方法中赋给ViewBag.Greeting属性的值(这就是译者前面所提到的视图渲染过程——译者注)。

对属性名Greeting没有特别的要求,可以用任意属性名来代替它,它会一样工作。当然,通过对多个属性赋值,可以将多个数据值从控制器传递给视图。通过运行该项目,可以看到第一个动态的MVC输出,如图2-11所示(请读者体会“动态”二字:动作方法可以根据不同的情况动态地对Greeting属性赋不同的值,而视图无须做任何修改,便可以动态地显示出正确的数据——译者注)。


cb7683ea6106c7a64ace0e3ec11d3f727815ab45

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
209 5
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
编解码 数据安全/隐私保护
.Net PdfiumViewer 打印时无法渲染电子签名问题的解决方法
【10月更文挑战第14天】这段内容介绍了使用 PdfiumViewer 库处理 PDF 文件时遇到电子签名无法打印的问题及其解决方法。首先分析了 PdfiumViewer 默认设置或对电子签名支持不足可能导致此问题,建议更新库版本并通过 NuGet 包管理器进行升级。接着检查打印机设置和驱动程序,确保设置正确且驱动为最新版本。然后优化自定义打印代码,提高渲染分辨率,确保电子签名正确加载。最后,验证 PDF 文件格式和兼容性,必要时联系技术支持或求助技术社区。
750 2
|
开发框架 前端开发 .NET
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。
356 6
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
236 3
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
339 3
|
XML 开发框架 .NET
ASP.NET Web Api 如何使用 Swagger 管理 API
ASP.NET Web Api 如何使用 Swagger 管理 API
442 1
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
268 1
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
266 0