MVC基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tink_bell/article/details/80875871

这里写图片描述

MVC模式

  术语“模型-视图-控制器”,MVC前置关注分离(Separation of Concerns)域模型和控制器逻辑与UI是松耦合关系。在一个Web应用程序中,这意味着凌乱的HTML与应用程序的其它部分是分离开来的,从而使维护与测试更加简单容易。

1、理解MVC模式

  从高级术语上说,MVC模式意味着一个MVC应用程序将被分离成至少3个部分。
  (1)模型(Model):含有或表现用户进行操作的数据。模型可以是简单的视图模型(View Model),它们只表现视图与控制器之间传递的数据:也可以是域模型(Domain Model),它包含业务领域的数据,以及处理这些数据的操作、转换和规则。
  (2)视图(View):用于将模型的某些部分渲染成用户界面。
  (3)控制器(Controller):处理传入的请求,执行模型上的操作,并选择渲染给用户的视图。

  MVC架构的每一个部分都是定义良好和自包含的,这称为关注分离。模型中操作数据的逻辑仅包含在模型中,显示数据的逻辑仅包含在视图中,而处理用户请求和用户输入的代码仅包含在控制器中。利用各部分之间清晰的分离,无论应用程序有多大,在其整个生命周期中都会更易于维护和扩充。

2、域模型与存储库

  1.理解域模型
  2.MVC的ASP.NET实现
  3.MVC与其他模式比较

3、用依赖项注入(DI)创建松耦合系统

  1.使用依赖项注入
  2.使用依赖项注入容器

4、自动化测试基础

  1.理解单元测试
  2.理解集成测试

  这里有一个叫做TDD的开发,测试驱动开发。


基本语言特性

1、使用扩展方法

  (1)对接口运用扩展方法
  (2)创建过滤扩展方法

2、使用lambda表达式
使用一个委托,可以使“扩展过滤”方法更通用。
3、自动类型接口
C#的var关键字允许定义一个局部变量,而不必明确地指定该变量的类型。这成为“类型推断”或“隐式类型”。
4、使用匿名类型
5、执行语言集成查询(LINQ)
6、使用Async方法

  对C#的一个最大的补充是改善了异步方法的处理方式。异步方法在后台执行和工作,并在工作完成时通知你,这允许在后台工作执行期间,使你的代码能够处理其他失误。异步方法是消除代码性能瓶颈的一个重要工具,并让应用程序能够利用多处理器和处理器内核并行地进行工作
  运用async和await关键字


使用Razor

  视图引擎(View Engine)负责处理ASP.NET内容,并查找有关指令,这些指令典型的是将动态内容插入到发送给浏览器的输出,而Razor是MVC框架视图引擎的名称。

1、准备示例项目

  在学习Razor是要意识到,视图的目标是将模型的一个或多个部分表现给用户,记住这一点是有好处的,而且这也意味着,视图会生成显示数据HTML,这些数据来自于视图所接收的一个或多个对象。如果你总是能记住“这是在建立一个能够发送给客户端的HTML页面”,name,Razor所做的一切事情就变得有意义了。

2、使用模型对象

  Razor语句以@字符开始。

@model 命名空间下的domain
@Model.Name
注意:声明视图模型对象的类型使用@model(首小写的m),而访问Name属性使用了@Model(首大写的M)。
3、使用布局

  视图文件中的另一个Razor表达式如下。

@{
Layout=null;
}

  这是一个Razor代码块的例子,这种代码块让允许在视图中包含C#语句。这种代码块以“@{”开始,以“}”结束,而其中的语句会在视图被渲染时进行评估(执行)。
  这里将Layout属性设置为null的效果是告诉MVC框架,该视图是自包含的,并且会渲染客户端所需要的全部内容。自包含视图十分适用于简单示例应用程序,但一个实际项目可能会有数十个师徒。布局是十分有效的末班,它含有用以创建应用程序一致性的标记——这能够确保在结果中包含适当的JavaScript库。

  1.创建布局
  Views文件夹中以下划线“_”开头的文件是不是被返回给用户的,它允许通过文件名来区分要进行渲染的视图和对视图进行支持的文件。布局是支持文件,故以下划线为前缀。
  @RenderBody方法的调用会将动作方法所指定的视图内容插入到布局标记之中。

  2.运用布局
  为了将布局运用于视图,只需要设置Layout属性的值即可。布局中包含了一些HTML元素,这些元素定义了对浏览器进行响应时的HTML页面的结构,因此,可以从视图中将这些元素去掉。

@model Razor.Models.Product

@{
    ViewBag.Title="Product Name"
    Layout="~/Views/_BasicLayout.cshtml";
}
Product Name:@Model.Name    

  3.使用视图起始文件
  还有一个问题要解决,就是必须在每一个视图都要指定布局文件。这意味着,如果需要重命名布局文件,那么必须找出引用该布局的每一个师徒,并进行修改。这将是一个易错的过程,而且这与贯穿于MVC框架的易维护主题是相悖的。

  通过使用视图起始文件可以解决此问题。在渲染一个视图时,MVC框架会查找一个叫做_ViewStart.cshtml的文件。框架会将此文件的内容视为视图问价的一部分,于是就可以使用这一特性为Layout属性自动地设置一个值。

  这样就可以在其它视图页面中去掉这一部分的代码,此外视图文件中的这一属性的优先级高于视图起始文件的优先级(意即,若在视图中重新定义了Layout的值,会覆盖视图起始文件中所指定的布局。)

4、使用Razor表达式

  在一个好的MVC框架应用程序中,动作方法与视图所起的作用是清晰、分离的。

组件 要做的事 不做的事
动作方法 向视图传递一个视图模型 向视图传递格式化的数据
视图 用视图模型对象向用户表现内容 修改视图模型对象的任何方面

  1.插入数据值

  2.设置标签属性的值

  3.使用条件语句

@switch((int)ViewBag.ProductCount){
    case 0:
        @: Out of Stock
        break;
    case 1:
        <b>Low Stock(@ViewBag.ProductCount)</b>
        break;
    default:
        @ViewBag.ProductCount
        break;
    }

  提示:必须将ViewBag.ProductCount属性的值转换成int才能够在switch语句中使用它。因为Razor中的switch表达式不能求取动态属性的值——必须转换成指定的类型,才能够让它知道如何执行比较。
  在Razor代码块的内部,只要通过定义HTML意即Razor表达式,就可以将HTML元素和数据值插入到视图输出,想这样:

<b>Low Stock (@ViewBag.ProductCount)</b>

或者像这样:

@ViewBag.ProductCount

  不必将元素或表达式放在引号内,或以特殊的方式来表示它们——Razor引擎会将这些解释为处理的输入。然而,如果你想将未包含在HTML元素中的文字文本插入到视图,则需要使用Razor的一个辅助工具,并以它做为这一行的前缀,想这样:

@:Out of Stock

  @:字符阻止Razor将此行解释为一条C#预计,这是Razor遇到文件时的默认行为(意即,若一行文本未使用@:为前缀,则Razor默认将此行视图是一条C#语句)。

  4.枚举数组和集合
  在编写MVC应用程序时,你会经常希望枚举一个数组或一些其他形式对象集合的内容,并生成一种细节内容。

@model Razor.Models.Product[]

  这里与前面稍微有些不通,这里在强类型视图的代码中的后面加上了中括号 [ ] ,表明引用的是一个数组。

  5.处理命名空间
  一个视图可以包含多个@using表达式。使用@using表达式引入了Razor.Models命名空间,这意味着可以去掉@model表达式和foreach循环中的命名空间。然后代码就变成了这样。

@using Razor.Models
@model Product[]

猜你喜欢

转载自blog.csdn.net/Tink_bell/article/details/80875871