• 第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)


      本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序。

      笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序。(对于一些未进行解释的内容,笔者提供了参考章节,在那里你会看到完整的细节)

      (由于各个 VS 版本不一样,有些功能用不了的话可以通过“工具”、“设置”、“专家设置”启用全部特性(新的版本可能不需要这一步))

    第一步:创建新的 ASP.NET MVC 项目

        1、“新建项目”——“Web(Visual C#)”——“ASP.NET Web 应用程序”

        2、设置文件名、存储路径,单击“确定”按钮。

        3、(该模板创建的项目带有不同的起点和特性配置,如认证、导航以及视觉主题等)为了保持事情简单,选择“空模板”选项并在“添加文件夹和核心引用”部分勾选“MVC”复选框。(这会创建一个基本的 MVC 项目,它带有最少的预定义内容,这也是本书用于所有示例的起点)

        (PS:其他模板选项意在为 ASP.NET 项目提供更为完整的起点。但笔者不喜欢这些模板,因为它们鼓励开发者将一些重要特性视为黑盒进行操作。本书的目标是为你提供知识并融合 MVC 应用程序的各个方面,因而本书所有示例使用的几乎是这个“空模板”)

    第二步:添加一个控制器

        在 MVC 体系架构中,输入请求是由控制器(Controller)来处理的。(在 ASP.NET MVC 中,控制器通常是一些继承于 “Syster.Web.Mvc.Controller” 的 C# 类“Syster.Web.Mvc.Controller”是框架内置的控制器基类

        控制器中的每一个 public 方法(“类”,当然要有方法)都称为是一个动作方法——可以用某个 URL 通过 Web 来调用它执行一个动作

        MVC 约定,将控制器放在 Controllers 的文件夹中,该文件夹是在建立项目时创建的

        (提示:你不一定要遵循这一约定或其他大多数 MVC 约定,但笔者建议你还是遵循它——至少因为它有助于弄清本书示例的意思。(现在的编程方式提倡“约定优于配置”,这可以省去编程过程中很多琐碎的事情,故在可能的情况下,应当优先遵循约定))

       对项目添加控制器步骤如下:

        1、“右击“Controllers”文件夹”——“添加”——“控制器”

        2、在“添加支架”对话框中,选择“MVC 5-空控制器”选项,然后单击“添加”按钮。

        3、在“添加控制器”对话框中,将其名称设置为 “HomeController”,然后单击“添加”按钮。

        (控制器名称有几个约定:提供的控制器名称应当指明其目的;默认的控制器名称为“Home”;控制器名称具有“Controller”后缀)

        2.2.2 理解路由

           除了模型、视图、控制器之外,MVC 应用程序还使用 ASP.NET 的路由系统——它决定如何将 URL 映射到控

        制器和动作上。(当 Visual Studio 创建 MVC 项目时,会添加一些默认的路由,以使我们能够开始工作——你可以

        请求以下任何一个 URL(“/”、“/Home”、“/Home/Index”),它们都会被引向 HomeController 上的 Index 动作。

        (这受益于遵循 MVC 的约定——这里有一个名称为“HomeController ”的控制器))

           如果不遵循这种约定,则需要修改路由,以指向所创建的替代控制器。(可以打开“App_Start文件夹”中的

        “RouteConfig.cs文件”来查看和编辑路由配置。第16章和第17章将解释这个文件中的条目)对于这个简单示例,应用

        默认配置就行了。

    第三步:渲染 Web 页面

        为了产生一个对浏览器的请求进行响应的 HTML,需要创建一个视图(View)

        1、修改控制器中的方法(在 HomeController.cs 文件中修改 Index 方法,以渲染一个视图)

              public  ViewResult  Index ()

              { return View() ; }

            当从一个动作方法返回一个 ViewResult  对象时,便是在指示 MVC 去渲染一个视图。(调用不带参数的View 方法,便可以

          创建这个 ViewResult 对象。这是在告诉 MVC,去渲染该动作的默认视图)MVC 约定的另一个例子:视图是通过命名约定与动

          作方法相关联的。(在 “Views”文件夹中将生成与方法具有相同名字的视图文件)

        2、创建视图最简单的方法是要求 Visual Studio 来做这件事——在 HomeController.cs 文件的代码编辑窗口中定义 Index 动作

          方法的任意地方右击然后从弹出的菜单中选择“添加视图”

        3、在“添加视图”的对话框中配置待创建视图文件的初始内容:将“视图名”设置为“Index”(与该视图相关联的动作方法的名称,这是

          另一个约定)——将“模板”设置为“空模板无模型”——让“创建为分部视图”和“使用布局页”复选框处于未选状态——单击“添加”按钮,

          创建这一新的视图文件。

          (Visual Studio 将在 Views Home 文件夹中创建一个名称为 “Index.cshtml” 的视图文件。这是 MVC 框架的另一个约定:视图

          被放置在 Views 文件夹中,文件夹的结构是与其关联的控制器名称相对应的。)

            该文件主要含有 HTML 语句。不同的是会看到如下所示的部分:

              ……
              @{
                Layout = null;
              }
              ……

            这是一个将由 Razor 视图引擎进行解释的表达式,Razor 引擎处理视图内容并生成发送给浏览器的 HTML。(这里是一个简单
          的 Razor 表达式,它告诉 Razor 未选用布局——布局类似于发送给 HTML 模板)

            在 Index.cshtml 的 div 中可以添加 “Hello World ( from the view )”,这一添加显示了用 HTML 标记显示出来的消息(而不
          是由动作方法显示的字符串)。

            在最初编辑 Index 动作方法时,它返回的是一个字符串值,这意味着 MVC 除了把这个字符串传递给浏览器之外,未做其他

          事情。

            现在,Index 方法返回了一个 ViewResult,MVC 框架渲染了一个视图并返回了它所产生的HTML。(这里并未告诉 MVC 应该
          使用哪个视图,因此它会运用命名约定自动寻找一个视图。该约定是,视图包含在以控制器命名的文件夹之中,并且具有动作方法
          的名称:Views /Home /Index.cshtml)

            除了字符串和 ViewResult 对象之外,也可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,浏览器将被重

          定向到另一个 URL。这些对象统称为动作结果,它们都派生于ActionResult 类。(动作结果系统使开发者能够在动作中封装并重用

          常用的响应,第17章将对其做更多介绍并演示一些更复杂的运用)

          2.3.2 添加动态输出

            Web 应用程序平台的关键是构造并显示动态输出在 MVC 中,控制器的工作是构造一些数据,并将其传递给视图而视图则

          负责把它渲染成 HTML

          (现在有很多人都把“渲染”说成“呈现”,其实这种说法是不正确的。Web 页面从服务器到浏览器的整个呈现过程实际上分为三步:

          第一步是通过视图引擎对视图文件进行解释,将视图文件中的代码转换成 HTML 标记,这一步叫做渲染;第二步是将渲染后的

          HTML 标记传递给客户端浏览器,这一步是页面的传递;第三步是浏览器接收到 HTML 后对其进行处理并呈现为 Web 页面,这

          一步才叫做呈现。由此可见,渲染是把页面的非 HTML 代码转换成 HTML 标记,这一步工作是由服务器完成的)

            将数据从控制器传递给视图的一种方式是使用 ViewBag(视图包)对象,它是 Controller 基类的一个成员ViewBag 是一种

          动态对象可以给它赋任意属性,使这些属性的值在随后渲染的视图中是可用的

          在 HomeController.cs 文件中设置一些视图数据:

              public ViewResult Index()

              {

                int hour = DateTime.Now.Hour;

                ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";

                return View();

              }

            当对 ViewBag.Greeting 属性进行赋值时,便是为视图提供数据。(Greeting 属性直到对其赋值的那一刻才会形成——这让

          作者能够以自如而流畅的方式(即不必提前定义类)将数据从控制器传递给视图)

            在视图中再次查阅 ViewBag.Greeting 属性,便可获得其数据值

          在 Index.cshtml 文件中接收 ViewBag 的数据值:

              <div> @ViewBag.Greeting World ( from the view ) </div>   (这里是一个 Razor 表达式)

            当在控制器的 Index 方法中调用 View 方法时,MVC 框架会定位 Index.cshtml 视图文件,并要求 Razor 视图引擎解析该文

          件的内容。Razor 会寻找类似于在该清单中所添加的这种表达式,并处理它们。(在这个例子中,处理该表达式意味着在视图

          中插入作者在动作方法中赋给 ViewBag.Greeting 属性的值——这就是前面所提到的视图渲染过程)

            对属性名称 Greeting 没有特别要求,用任意属性名来代替,照样会正常工作,只要在控制器中使用的名称与视图中使用

          的名称相匹配即可。当然,通过对多个属性赋值,可以将多个属性值从控制器传递到视图。

      【上半部分结束】

  • 相关阅读:
    Educational Codeforces Round 11——A. Co-prime Array(map+vector)
    ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
    ACM程序设计选修课——1076汇编语言(重定向+模拟)
    NOJ——1672剪绳子(博弈)
    廖雪峰Java8JUnit单元测试-1JUnit简介-1JUnit测试
    廖雪峰Java7处理日期和时间-4最佳实践-最佳实践
    廖雪峰Java7处理日期和时间-3java.time的API-2ZonedDateTime
    廖雪峰Java7处理日期和时间-3java.time的API-1LocalDateTime
    廖雪峰Java7处理日期和时间-2Data和Calendar-2Calendar
    廖雪峰Java7处理日期和时间-2Data和Calendar-1Date
  • 原文地址:https://www.cnblogs.com/zhangchaoran/p/7402559.html
Copyright © 2020-2023  润新知