We need SMART Models, THIN Controllers, and DUMB Views.

VeryBeginning

要使用MVC,要先将MVC服务加到程序中去

  1. Nuget包里添加Microsoft.AspNetCore.Mvc
  2. Configure里增加MVCServices
     public void ConfigureServices(IServiceCollection services)
    {
    services.AddMvc();
    }
  3. 让程序调用MVC
    app.UseMvc(routes=> {
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}"
    );
    });

这里UseMvc()使用了Action configureRoutes类型的参数,也就是上文中定义的routes,可以理解为标记了(map)了一个具体的URL地址。具体地址为/controller/action/(可选)id。
其中

  • controller是你控件类的名字
  • action是控件类里的方法(属性)名称
  • id后的?代表可选。

例如template: "{controller=Jason}/{action=Something}/{id?}"map了一个地址:/Jason/Something
而name参数为default的情况下,表明当输入地址为:/的时候,转到template map的地址中去。

其中,当controller为Home,action为Index时,输入所有/controller,都会转到/controller/index中去

例如/Jason,转入/Jason/index;/another,转入/another/index。

而当每次点击/Jason,MVC就会调用ControllerActionInvoker,执行JasonController.Index(),也就是,我们在通过改变URL来调用不同的方法。

实际上,每当有新的请求,routing就会根据请求实例化一个controller,实际上我们并没有var x = new Jasoncontroller

关于action

public class ScottController
{
public string Index()=> "Hello from Scott";
}

当我们发出一个/Scott/Index的请求时,看上去在返回一个string,而实际上,action参数需求的实参其实为 IActionResult。
IActionResult有许多子类,如ViewResult、JavaScriptResult、HttpStatusCodeResult(ActionResult Class详解)等等,而上面代码中的string,等同于返回一个ContentResult。

实际上,上述代码其实是
public class ScottController:Controller
{
public IActionResult Index()=> Content( "Hello from Scott");
}

这里context实际上是ContenResult的Help Method。当然,大部分情况下前一种代码更加清晰易懂。

关于View

按照惯例,View存在于一个特定文件夹,当我们调用view出错时,会出现这样的界面(前提是开发环境为development并且在configure中调用了app.UseDeveloperExceptionPage();

实际上,当我们要调用view时,它必须按照/View/Controller/Action.cshtml的位置存储。
注意到上图中除了我们指定的Controller外,还有一个Shared,调用view时会从这两个路径依次寻找,如同字面意思,Shared的view可以被多个Controller同时使用。

View()有一个重载,可以让你指定cshtml文件的名称,当不传递实参时,

public class JasonController:Controller
{
public IActionResult Index()
{
return View();
}...
}

我们可以由Jason/index打开目录view/Jason/index.cshtml
当传递一个实参时,如

public class JasonController:Controller
{
public IActionResult Index()
{
return View("Other");
}...
}

源地址就会转到view/Jason/Other.cshtml

实际上,View的还有一个重载,参数为objec,实参就是model,你所建立的model都要从这里交给view接手。

关于Model

先从两个简单的Controller说起 1. ViewBag 它指向一个content 2. ViewData

实际上,ViewData就是一个model,简单地举例

 public IActionResult Index()
{
ViewData["Message"] = "Hello from Jason's controller"; return View();
}

在index.cshtml里 Hey @ViewData["Message"]
当输入之前的地址/Jason,就会得到Hello from Jason's controller,我们将这个string包装在了Message这个Model里面。

这个Model还可以复杂点,建立一个类,假装它是由数据库来的

 public class JasonIndexViewModel
{
public int Age { get; set; }
public string Name { get; set; }
}

在我们的index方法里,建立它的实例,并传入view()中

 public IActionResult Index()
{
var vm = new JasonIndexViewModel() { Age = 22, Name = "Jason" }; return View(vm);
}

实际上,建立的实例就是一个model,view不管数据从哪里来,只要传递给它就可以了,而model就是整合数据的模型。

关于Razor

至于如何让view展示model的内容,转到index.html,内容改为

@model MVAWebApplicationCore.Controllers.JasonIndexViewModel
<h1>Person!</h1>
<p>Name:@Model.Name</p>
<p>Age:@Model.Age</p>

其中,@字符代表的是Razor语法标记,可以看成HTML与C#进行了混合。

然后你就能得到类似这样的页面

记住,view没有逻辑,最好只让它showsomthing,view is dumb.

[学习心得][Introduction to ASP.NET Core 1.0]3-2 ASP.NET Core and MVC Pattern的更多相关文章

  1. Professional C# 6 and .NET Core 1.0 - Chapter 38 Entity Framework Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - Chapter 38 Entity F ...

  2. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

    一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...

  3. Professional C# 6 and .NET Core 1.0 - Chapter 42 ASP.NET Web API

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处: -------------------------------------------------------- ...

  4. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC

    What's In This Chapter? Features of ASP.NET MVC 6 Routing Creating Controllers Creating Views Valida ...

  5. 将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1.3X

    在上一篇文章ASP.Net Core 运行错误 Http Error 502.5 解决办法的最后有提到说,最推荐的升级办法是从2.0升级到2.1X版本. 操作如下 项目的例子直接使用https://g ...

  6. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  7. [学习心得][Introduction to ASP.NET Core 1.0]4-1 Creating a Form

    原视频地址https://mva.microsoft.com/en-US/training-courses/introduction-to-asp-net-core-1-0-16841?l=eYlqd ...

  8. .net core 1.0 中的asp.net identity 的基本使用 序言

    2016年6月底,微软发不了vs2015 up3,在这个版本中,微软做了一些改变,本人目前也尚在学习使用之中,现把学习和使用的心得写出来,错误之处请大家指正. 开发环境:vs2015 UP3   项目 ...

  9. .net core 1.0 中的asp.net identity 基本使用(一)

    1.修改密码强度:打开Startup.cs,在public class Startup{}内找public void ConfigureServices(IServiceCollection serv ...

随机推荐

  1. 微信小程序之----弹框组件modal

    modal modal类似于javascript中的confirm弹框,默认情况下是一个带有确认取消的弹框,不过点击取消后弹框不会自动隐藏,需要通过触发事件调用函数来控制hidden属性. 官方文档 ...

  2. vi的基本操作

    vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command m ...

  3. asp.net实现断点续传

    C# 断点续传原理与实现 在了解HTTP断点续传的原理之前,让我们先来了解一下HTTP协议,HTTP协议是 一种基于tcp的简单协议,分为请求和回复两种.请求协议是由 客户机(浏览器)向服务器(WEB ...

  4. Spring基本使用方法_Bean对象

    Spring基本使用方法_Bean对象 Struts与Hibernate可以做什么事? Struts MVC中控制层解决方案.可以进行请求数据自动封装,类型转换,文件上传,效验..... Hibern ...

  5. bzoj1121

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1121 题解: 神题啊,妈的不会写的都去吃屎吧.

  6. UVa 10382 - Watering Grass

    题目大意:有一条长为l,宽为w的草坪,在草坪上有n个洒水器,给出洒水器的位置和洒水半径,求能浇灌全部草坪范围的洒水器的最小个数. 经典贪心问题:区间覆盖.用计算几何对洒水器的覆盖范围简单处理一下即可得 ...

  7. PHP获取图片颜色值

    PHP获取图片颜色值,检测图片主要颜色的代码: <?php $i=imagecreatefromjpeg("photo3.jpg");//测试图片,自己定义一个,注意路径 f ...

  8. 1.1.2.托管对象模型(Core Data 应用程序实践指南)

    托管对象模型即对象图,可以看成实体类的描述,规定了数据字段. 要想创建托管对象模型,需生成NSManagedObjectModel类的实例.

  9. delphi中panel控件应用

    delphi中的panel控件是怎么使用的?研究了很久了,还是搞不懂,只知道把它放到form上面,其他操作一律不懂了,有谁可以请教一下,如何把其他控件放到里面去呢?谢谢 提问者采纳   直接把控件放到 ...

  10. C# winform ListView+CheckBox的做法

    1.设置ListView的属性:CheckBoxs=true 2.ListView字段第一列文本框为空,把工具箱里面的CheckBox控件拖到ListView的第一个字段做全选/全不选的控件. 3.C ...