本章将使用 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 没有特别要求,用任意属性名来代替,照样会正常工作,只要在控制器中使用的名称与视图中使用

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

  【上半部分结束】

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

  1. 【MVC 4】1.第一个 MVC 应用程序

    作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> ASP.NET MVC 是微软的一个 Web开发框架,它整合了“模型—视图—控制器(MVC)”架构 ...

  2. 创建第一个MVC应用程序

    整个国庆期假,Insus.NET没有出门,在家静心修炼MVC.这意味着Insus.NET将来的日子里会以MVC为学习,开发,应用作为重点,不过现在才开始踏出第一步...... 路慢慢...... 下载 ...

  3. 《精通ASP.NET MVC5》第7章 SportStore:一个真正的应用程序(1)

    7.1 开始 7.1.1 解决方案 个工程. 1. 一个域模块工程. 2.一个MVC4应用. 3.一个单元测试工程.         现在我们就创建一个名为 SportsStore 的空 soluti ...

  4. 第一个 MVC 应用程序(下半部分)

    2.4 创建一个简单的数据录入应用程序 本章的其余部分将通过一个简单的数据录入应用程序来考查 MVC 的更多基本特性.本小节打算分步进行,目的是演示 MVC 的运用. B1.设计一个数据模型 在 MV ...

  5. asp.net mvc 4 项目升级到 asp.net mvc5

    一.开始 1.打开或新建asp.net mvc 4项目 2.修改 global.asax文件 原: WebApiConfig.Register(GlobalConfiguration.Configur ...

  6. ASP.NET MVC5 第4章

    参考资料<ASP.NET MVC5 高级编程>第5版 第4章 模型 本章所探讨的模型是要显示.保存.创建.更新和删除的对象. 基架指使用 MVC 提供的工具为每个模型对象的标准索引构建.创 ...

  7. 《精通ASP.NET MVC5》第2章 第一个MVC应用程序

      控制器     public class NewHomeController : Controller     {         // GET: /NewHome/         public ...

  8. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  9. 【阅读笔记】《C程序员 从校园到职场》第二章 学校到职场

    一.代码规范: 1.变量命名(让人一眼看它是什么意思,要做什么操作),定义并初始化 2.函数命名规范(函数的功能)在主函数之前进行声明. 在实际项目中,一般不在函数调用者的内部来对被调函数进行声明,而 ...

随机推荐

  1. Docker搭建RabbitMQ集群

    Docker搭建RabbitMQ集群 Docker安装 见官网 RabbitMQ镜像下载及配置 见此博文 集群搭建 首先,我们需要启动运行RabbitMQ docker run -d --hostna ...

  2. STL与泛型编程(第一周)

    part 1 C++模版简介 一,模版概观 1.模板 (Templates)是C++的一种特性,允许函数或类(对象)通过泛型(generic types)的形式表现或运行. 模板可以使得函数或类在对应 ...

  3. 20145101《Java程序设计》第8周学习总结

    20145101<Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rew ...

  4. 20145304 Exp7 网络欺诈技术防范

    20145304 Exp7 网络欺诈技术防范 实验后回答问题 1.通常在什么场景下容易受到DNS spoof攻击 在公共网络下,如一些购物场所.咖啡馆.快餐店等提供的网络下:当自己常使用的无线网被有恶 ...

  5. 使用libcurl开源库和Duilib做的下载文件并显示进度条的小工具

    转载:http://blog.csdn.net/mfcing/article/details/43603525 转载:http://blog.csdn.net/infoworld/article/de ...

  6. Python3基础 time.localtime 当前系统的年月日 时分秒

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. HDU1143 (递推)题解

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. 使用u盘重装双系统中的乌班图

    之前的乌班图被我玩坏了,故而想重装一个.由于之前的双系统是同学帮我装的,我便到网上找各种资料,鼓弄了一天,终于完事了.把过程记录一下. window10 64bit ubuntu 14.04 desk ...

  9. HDU 6069 Counting Divisors(唯一分解定理+因子数)

    http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{ ...

  10. NOI 08 石头剪刀布

    石头剪刀布(NOI 08) 总时间限制: 1000ms 内存限制: 65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B ...