学习总结(ASP.NET MVC 5)

时间:2022-05-17 10:58:47

  1. 无论什么时候,如果要写一个新的 MVC 的程序(网站),打开VS之后第一步永远都是“创建新的 ASP.NET MVC 项目”

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

          选择“空模板”选项,并在“添加文件夹和核心引用”部分勾选“MVC”复选框

  2. 一个设计良好的 MVC 应用程序,必须从设计良好的模型开始,它是随后添加控制器和视图的焦点。

  3. 模型是定义应用程序主题的现实对象、过程以及规则的表示,称为域。

  4. 模型,通常称为域模型,包含应用程序域中要建立的 C#对象,称为域对象。这些域对象构成了应用程序的全部事物以及操纵这些对象的方法。

  5. 在 MVC 体系架构中,输入请求是由控制器(Controller)(继承于 “Syster.Web.Mvc.Controller” 的 C# 类)来处理的

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

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

  8. 当从一个动作方法返回一个 ViewResult  对象时,便是在指示 MVC 去渲染一个视图。(调用不带参数的View 方法是在告诉 MVC,去渲染该动作的默认视图)

  9. Razor 引擎处理视图内容并生成发送给浏览器的 HTML

  10. 除了字符串和 ViewResult 对象之外,也可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,浏览器将被重定向到另一个 URL。这些对象统称为动作结果,它们都派生于ActionResult 类。

  11. Web 应用程序平台的关键是构造并显示动态输出(在 MVC 中,控制器的工作是构造一些数据,并将其传递给视图,而视图则负责把它渲染成 HTML)

  12. Web 页面从服务器到浏览器的整个呈现过程实际上分为三步:第一步是通过视图引擎对视图文件进行解释,将视图文件中的代码转换成 HTML 标记,这一步叫做渲染;

  13. 渲染是把页面的非 HTML 代码转换成 HTML 标记,这一步工作是由服务器完成的

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

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

  16. 当对 ViewBag 的属性(如:ViewBag.Greeting)进行赋值时,便是为视图提供数据。如: ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";

  17. 对属性名称 Greeting 没有特别要求,用任意属性名来代替,照样会正常工作,只要在控制器中使用的名称与视图中使用的名称相匹配即可。当然,通过对多个属性赋值,可以将多个属性值从控制器传递到视图。

  18. 在视图中再次查阅 ViewBag.Greeting 属性,便可获得其数据值。如:<div> @ViewBag.Greeting World ( from the view ) </div>

  19. 当在控制器的动作方法(如:Index 方法)中调用 View 方法时,MVC 框架会定位到对应的视图文件(如: Index.cshtml )并要求 Razor 视图引擎解析该文件的内容——Razor 会寻找视图文件中的 Razor 表达式,并处理它们。(在这个例子中,处理该表达式意味着在视图中插入作者在动作方法中赋给 ViewBag.Greeting 属性的值——这就是前面所提到的视图渲染过程)

  20.通过“@Html.ActionLink”(如:@Html.ActionLink("现在回复", "RsvpForm") )可以在视图中添加一个指向动作方法的链接(这里指向的动作方法是 RsvpForm)。这个 ActionLink 方法有两个参数:第一个是该链接的显示文本第二个是用户单击该链接时将要执行的动作

  21. Html.ActionLink 是一个 HTML 的辅助器方法 —— MVC 框架附带了一组内置的辅助器方法,它们可以方便地用来渲染 HTML 的链接、文本输入框、复选框 以及其他种类的内容。

  22. 与传统的 ASP.NET 应用程序不同,MVC 的 URL 并不对应物理文件。每个动作方法有它自己的 URL,而 MVC 使用 ASP.NET 的路由系统将这些 URL 转换成动作。

  23. 强类型视图意在渲染一个特定的域类型。(如果指定了想使用的类型(本例是 GuestResponse),MVC 将能够提供一些便于使用这个类型的便捷方法,从而可以在视图中方便地使用这个类型对象)

  24. 如果已经创建了 GuestResponse 类,但未进行编译,MVC 将不能为这个类型创建强类型视图。 要编译应用程序,可以 “生成”——“生成解决方案”,或简单地按快捷键 F6。

  25. 通过 “@using (Html.BeginForm()) { } ” 可以在视图中创建表单
          <p>姓名:@Html.TextBoxFor(x=>x.Name) </p>                // 输入框
          <p>是否参加?@Html.DropDownListFor(x=>x.WillAttend, new[ ] {    // 下拉框
              new SelectListItem() { Text="是,我参加", value=bool.TrueString },        // 下拉选项
              new SelectListItem() { Text="否,不参加", value=bool.FalseString }   }, “请选择”)   // 显式文本
           </p>
          <input type="submit" value="回复邀请" />             // 按钮
        }

  26. 这个TextBoxFor 辅助器方法会生成一个 type 为 “text” 的 input 元素的 HTML,将该元素的 id 和 name 标签属性设置为所选的域类的属性名。如:<input id="Phone" name="Phone" type="text" value="" />

  27. 替代运用 lambda 表达式的另一种方法是将模型类型的属性名指定为一个字符串,如:@Html.TextBox("Email")

  28. 为了接收并处理表单所递交的数据,这里打算使用一个聪明的特性——添加第二个 RsvpForm 动作方法,以形成如下作用:

    一种方法用于响应 HTTP 的 GET 请求:GET 请求是某人单击一个链接时,浏览器正常发出的请求。

    一种方法用于响应 HTTP 的 POST 请求:默认情况下,用 Html.BeginForm() 渲染的表单是由浏览器作为一个 POST 请求递交的。这个动作负责接收所递交的数据,并决定用它做什么。(这里需要这样做是因为并未给辅助器方法 Html.BeginForm 传递任何参数——于是它假设要回递的目标是请求此 HTML 文档的同一个 URL——动作方法)

  29. 这两种方法都由相同的 URL 进行调用,但 MVC 确保会根据所处理的是 GET 请求或 POST 请求,来调用合适的方法。

        [ HttpGet ]
        public ViewResult RsvpForm()  { return View(); }

        [ HttpPost ]
        public ViewResult RsvpForm(GuestResponse  gr)
        {
          return View("Thanks", gr);
        }

  30. 验证是为了防止用户输入无意义的数据。

  31. 在 MVC 应用程序中,验证条件定义在模型类中,并在运用模型类的所有地方生效。

  32. ASP.NET MVC 中的验证规则声明是通过标准的 C# 注解属性特性来实现的。(需要引用 System.ComponentModel.DataAnnotations 命名空间)

  33. 对于应用程序必须支持的业务或活动中存在的现实实体、操作以及规则等,可以对它们创建模型,称为域模型。—— 域模型往往是一组 C# 类型(类、结构等)

  34. 域中的操作由域类型中定义的方法类实现,而域规则表示成这些方法中的逻辑。或者通过运用 C# 的注解属性来实现。

  35. 域模型通常是持久化的,且一直处于活动状态;其实现有许多不同方式,但关系型数据库是最通常的选择。

  36. 简言之,域模型是应用程序中业务数据及其处理的唯一和权威的定义。

  37. 域模型方法解决了应用程序维护中出现的许多问题。 如果需要操作模型中的数据、添加新的过程或规则,域模型是应用程序必须修改的唯一地方。

  38. 强制域模型与 ASP.NET MVC 应用程序的其余部分分离的一个常用办法是,将模型放在一个独立的 C# 程序集中(意即,将域模型放在应用程序的一个专门的子项目中)。采用这种方式,可以在应用程序的其他部分创建对域模型的引用,以确保不会引用其他地方。这在大型项目中是特别有用的,从第7章开始创建的示例中,所演示的就是这种方法。

  39. 视图模型:它们只表现视图与控制器之间传递的数据。

  40. 域模型:它包含业务领域的数据,以及处理这些数据的操作、转换和规则。

  41. 视图(View):用于将模型的某些部分渲染成用户界面。

  42. 控制器(Controller):处理传入的请求,执行模型上的操作,并选择渲染给用户的视图

  43. 模型不涉及 UI 渲染或请求处理——那些是视图和控制器的职责。(不要将视图和控制器的职责放到模型中进行定义,这些不是模型的职责)
  44. 视图含有将模型元素显示给用户的逻辑,仅此而已。

  45. 控制器是视图与模型之间的桥梁——请求来自客户端,并由控制器对其进行服务,进而选择一个相应的视图向用户进行显示,并在必要时执行模型上的相应操作。
  46.显示数据的逻辑仅包含在视图中,而处理用户请求和用户输入的代码仅包含在控制器中。

  47. 视图模型是指一种简单的模型类,只用于从控制器向视图传递数据。域模型则与之相反,它是数据、操作以及规则的完整表示。