• [学习心得][Introduction to ASP.NET Core 1.0]3-2 ASP.NET Core and MVC Pattern


    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.

  • 相关阅读:
    React路由基本的使用(一)
    Codeforces Round #627 (Div. 3) C
    Codeforces Round #627 (Div. 3) B
    Codeforces Round #627 (Div. 3) A
    hdu2049 不容易系列之(4)——考新郎(组合,错排)
    Codeforces Round #626 (Div. 2) E. Instant Noodles(二分图,最大公因数)
    Codeforces Round #626 (Div. 2) D. Present(位运算)
    逆元的计算方法
    Educational Codeforces Round 83 D. Count the Arrays(组合,逆元,快速幂)
    hdu4460 Friend Chains(记忆化广度优先搜索)
  • 原文地址:https://www.cnblogs.com/mirageJ/p/6431480.html
Copyright © 2020-2023  润新知