• ASP.NET MVC Part.1(创建基本的 MVC 应用程序)


           MVC 基于 ASP.NET,因此所有的 ASP.NET 技能都可应用到 MVC 应用程序。MVC 是支持利用 ASP.NET 知识快速构建应用的框架,与 Web 表单非常类似,与动态数据框架也非常类似。

           MVC 代表模型-视图-控制器,它们是这种应用程序开发风格的 3 个主要组件的名称。

    • 模型表示数据模型,它可以对持久化应用程序数据执行 CRUD(Create、Read、Update、Delete) 操作。功能抽象是 MVC 的关键部分。模型是应用程序中唯一和数据存储进行交互的地方。
    • 视图是呈现给用户的部分,它是一个 ASP.NET .aspx 页面。页面的内容通常和用户要执行的 CRUD 操作紧密相关,并且因此通常包含一个或多个数据项的内容,或者具有某种编辑或删除数据项的工具。
    • 控制器是用作视图和模型间桥梁的 C# 代码文件。控制器从客户端接收请求并选择要服务于请求的视图

    MVC 和 Web 表单的选择

           相比 Web 表单,MVC 有一系列的优点:

    • 模型、视图和控制器的分离使得应用程序各方面的单元测试更容易进行
    • 对于 MVC 应用程序可以在细节方面进行更多的控制
    • 避免了在服务器端和客户端传送大量状态数据的工作,而 Web 表单却因此在因特网上制造了不少麻烦

           尽管如此,Web 表单框架仍是一个强大的平台。它丰富的控件库使你能快速创建功能强大的应用程序,Web 表单程序的创建和运行相对比较容易,创建 Web 应用程序所需的技能很容易在市场上获得。Web 表单不会消失,这项技术还会持续发展和更新。

           Web 表单能够继续统领局域网应用。但基于因特网的 ASP.NET 应用程序会逐步贴近 MVC,因为 MVC 拥有对测试的更佳支持并且可控性更强。

     

    创建基本的 MVC 应用程序

           首先,在 VS 中创建一个 ASP.NET MVC2 Web 应用程序。

           MVC 模型特别适合进行单元测试,因为模型、视图、控制器可以分别进行测试因此创建项目时会被提示是否创建单元测试项目。关于单元测试这里不做叙述。大家可以搜索相关知识。

    image

           项目目录的名称和它们的功能相对应。Content 目录包含应用程序的静态项,如图片。Scripts 目录保存了 JavaScript 文件;MVC 项目模板会创建 jQuery 以及一些基本验证和 Ajax 特性所需的文件。

           Controllers 目录包含控制类,它需要遵循特定的结构,而 Visual Studio 能帮你进行处理。

           Models 目录中有你要使用的数据模型,其中可以拥有多个数据模型。在本示例中我们使用实体框架生成模型,它位于放置类型定义以及上下文相关类的目录中。

           Views 目录包含 .aspx 文件,用于向用户呈现内容。这个目录也拥有特定的结构。

           MVC 项目的结构有特定的默认规范。你不一定要把项放到默认的目录中,但如果这样做就可以利用 MVC 内置的一些方便特性。

    1. 创建模型

           MVC 应用程序的模型部分可以是能够操作应用程序数据的任何东西。通常它会是 LINQ to SQL 或者实体框架模型。再次强调贯穿 MVC 的抽象性,将模型与其他组件分离使你能够以最小的代价来改变模型。例如,将本来存储在文本文件中的数据移动到 SQL Server 中。Models 目录保存了那些包含数据处理逻辑的类。

           这里我使用 Northwind 示例数据库创建一个实体框架模型。右击 Models 目录,添加新项目,选择 ADO.NET Entity Data Model 。创建数据模型后应该立刻编译项目,这样创建控制器时就可以使用模型数据类型,同时智能提示才能够帮助自动显示类名。

    2. 创建控制器

           控制器处理请求并决定哪个视图将被返回到客户端。多数请求来源于视图。例如,用户可能会请求 MVC 应用程序的默认页面,而控制器会提供一个列出了特定数据库表全部记录的视图。视图生成的 HTML 又会包含链接,它们会对控制器产生进一步的请求。例如,某个链接会请求特定行的详细视图。

           创建控制器最简单的办法是右击 Controllers 目录,选择添加控制器。你会被提醒输入控制器的名称,它应遵循以 Controller 结尾的命名习惯。例如,我们要创建的控制器和 Northwind 数据库的 Products 表一起工作,因此我们可以命名为 ProductController。提示框中还有一个复选框,它为创建、更新、删除和详细场景创建活动。选中这个复选框后,VS 会使用正确的命名习惯创建模板方法。完成后,Controllers 目录中会创建一个 ProductController.cs 的文件,下面是该文件的开头代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using BasicMvcApplication.Models;
     
    namespace BasicMvcApplication.Controllers
    {
        public class ProductController : Controller
        {
            //
            // GET: /Product/
     
            public ActionResult Index()
            {
                return View();
            }
     
            //
            // GET: /Product/Details/5
     
            public ActionResult Details(int id)
            {
                return View();
            }

           在每个方法前的注释解释了控制器方法被调用时的请求格式。例如,用户请求 URL/Product/ 时就会调用 Index 方法

           对于我们的基础应用,希望这个方法返回 Northwind Products 表的全部项。也就是说,Index 控制器方法的责任是从 Products 表中获取记录并选择用于呈现这些数据的视图。下面是完整的方法:

    public ActionResult Index()
    {
        NorthwindEntities db = new NorthwindEntities();
        var data = db.Products;
        return View(data);
    }

           后面会解释 View() 方法,现在只要知道它选择默认视图来显示 Products 表的索引就可以了。

    3. 创建 Index 视图

           在控制器方法 Index 中调用 View 时,传入了 Product 实例的集合。它用于告诉 MVC 框架应该使用 Product 类型的 Index 视图显示数据,问题是这个视图并不存在。

           要创建这个视图,右击 Index 控制器方法的任意代码,选择添加视图。你可以看到视图的名称已经通过控制器方法名称给出建议。选择创建强类型视图的选项,并从列表中选择 BasicMVCApplication.Models.Product 类型,这将会创建使用这个数据模型类型成员的视图(如果没有类型可选,编译后再尝试)。

           为视图内容选择“列表”,它用于选择要创建的视图类型。它的可选项和控制器类中创建的模板方法相对应单击添加后,VS 创建 Views/Products 目录并生成视图文件 Index.aspx。这个文件里你会看见一些新标记,后面我会介绍这些标记。

    image

    4. 测试(未完成的)应用程序

           现在,有了一个模型,部分编码的控制器以及一个视图。这对于检查项目是否正常工作已经足够了。允许程序,浏览器会显示程序的默认视图,它是由 MVC 模板创建的,后面我们会修改默认视图。为了能够连接到我们的控制器,在浏览器的 URL 后面加上 /Product,URL地址格式如下:

    http://localhost:7537/Product

    image

           可以看到每一行都被列出,并且每行都有对应的编辑、删除、详细的链接。屏幕底部是“创建新项目”的链接。但是单击任一链接,都会看见错误发生,这是因为我们还没创建这些链接的视图或者实现关联的控制器方法。

    5. 完成控制器和视图

           既然已经有了基本的框架,现在我们实现剩余的控制器方法以及与之对应的视图。完整代码及详细注释在代码中,如下所示:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using BasicMvcApplication.Models;
     
    namespace BasicMvcApplication.Controllers
    {
        public class ProductController : Controller
        {
            //
            // GET: /Product/
     
            public ActionResult Index()
            {
                NorthwindEntities db = new NorthwindEntities();
                var data = db.Products;
                return View(data);
            }
     
            //
            // GET: /Product/Details/5
     
            public ActionResult Details(int id)
            {
                NorthwindEntities db = new NorthwindEntities();
                var data = db.Products.Where(e => e.ProductID == id).Select(e => e).Single();
                return View(data);
            }
     
            // 这个 Create 方法的任务是创建一个新的 Product 实例并把它传递给 View 方法
            // 这个 Create 方法当用户在 Index 视图上单击 “创建新项目” 时会被调用
            // GET: /Product/Create
     
            public ActionResult Create()
            {
                return View(new Products());
            }
     
            // 下面这个 Create 方法则是在用户填充了新产品的细节并提交表单时被调用
            // 需要修改它的参数,使之接受 Products 实例
            // 这是 MVC 中一个方便的特性,HTTP POST 操作被转换为控制器处理的数据类型
            // POST: /Product/Create
     
            [HttpPost]
            public ActionResult Create(Products prod)
            {
                try
                {
                    // TODO: Add update logic here
                    NorthwindEntities db = new NorthwindEntities();
                    db.AddToProducts(prod);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                catch
                {
                    return View();
                }
            }
     
            // 和 Create 方法类似,Edit 和 Delete 功能也是成对出现的,操作中的模式是相同的
            // 用户开始编辑或删除时调用一个方法,而完成操作并修改数据库时调用另一个方法
            // GET: /Product/Edit/5
     
            public ActionResult Edit(int id)
            {
                NorthwindEntities db = new NorthwindEntities();
                var data = db.Products.Where(e => e.ProductID == id).Select(e => e).Single();
                return View(data);
            }
     
            // 下面这个 Edit 方法除了传入用户编辑过的那个产品的 ID 外,
            // 还传入一个包含描述产品信息的 名称/值 对的 FormCollection
            // POST: /Product/Edit/5
     
            [HttpPost]
            public ActionResult Edit(int id, FormCollection collection)
            {
                try
                {
                    // TODO: Add update logic here
                    NorthwindEntities db = new NorthwindEntities();
                    Products prod = db.Products.Where(e => e.ProductID == id).Select(e => e).Single();
     
                    // 这是一个非常有用的便捷方法,它使用用户提交的字段来更新之前从模型获得的对象
                      UpdateModel(prod); 
                    db.SaveChanges();
     
                    return RedirectToAction("Index");
                }
                catch
                {
                    return View();
                }
            }
     
            //
            // GET: /Product/Delete/5
     
            public ActionResult Delete(int id)
            {
                NorthwindEntities db = new NorthwindEntities();
                var data = db.Products.Where(e => e.ProductID == id).Select(e => e).Single();
                return View(data);
            }
     
            //
            // POST: /Product/Delete/5
     
            [HttpPost]
            public ActionResult Delete(int id, FormCollection collection)
            {
                try
                {
                    // TODO: Add delete logic here
                    NorthwindEntities db = new NorthwindEntities();
                    var data = db.Products.Where(e => e.ProductID == id).Select(e => e).Single();
                    db.Products.DeleteObject(data);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                catch
                {
                    return View();
                }
            }
        }
    }

           对于每个控制器方法,右击代码声明增加视图。每组方法只要给第一个添加视图即可。最后,在 Views/Product 目录应该有 5 个视图:Create.aspx、Delete.aspx、Edit.aspx、Details.aspx、Index.aspx。

           现在,已经有了一个完成但很基本的 MVC 应用程序。所有的链接和功能也都可用了。

    6. 修改 Site.Master 文件

           最后的任务是更新 Views/Shared 目录中的 Site.Master 文件,让它不再引用由 VS MVC 项目自动创建的 HomeController。修改第一个活动的链接,使最后一个参数为 Product:

    <li><%: Html.ActionLink("主页", "Index", "Product")%></li>

    删除第二个链接(指向 About 活动方法),这里不会实现它。

  • 相关阅读:
    递归--练习5--noi1751分解因数
    递归--练习4--noi666放苹果
    递归--练习3--noi7592求最大公约数问题
    递归--练习2--noi6261汉诺塔
    递归--练习1--noi3089爬楼梯
    JavaScript--语法4--函数1
    JavaScript--语法3--数组
    JavaScript--练习1--99乘法表
    应用排行榜第一名脸萌仅仅是刹那的烟火
    Readprocessmemory使用方法
  • 原文地址:https://www.cnblogs.com/SkySoot/p/2971399.html
Copyright © 2020-2023  润新知