65.9K
CodeProject 正在变化。 阅读更多。
Home

了解 Microsoft ASP.NET MVC 基础

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (13投票s)

2014 年 8 月 21 日

CPOL

10分钟阅读

viewsIcon

40281

本文旨在帮助您理解 Microsoft ASP.NET MVC 的基础知识,并附带代码片段进行基本概念的讲解。

引言

本文将帮助您了解流行且强大的 Microsoft ASP.NET MVC 框架,用于开发强大的 Web 应用程序。在掌握任何技术之前,打好基础至关重要。本文将帮助您开始使用 Microsoft ASP.NET MVC。

什么是 Microsoft ASP.NET MVC?

Microsoft ASP.NET MVC 框架是 Microsoft 强大的 .NET 框架的扩展,它能够开发强大的 Web 应用程序。ASP.NET 提供了传统 ASP.NET Web 开发模型——ASP.NET Web Forms 的替代方案。

ASP.NET MVC 提供了一种用于开发 Web 应用程序的架构方法。所使用的模式通常被称为 MVC 设计模式。MVC 将应用程序划分为三个独立的组件/层,称为 **模型、视图和控制器**。

MVC 的目的

MVC 的主要目的是使这些层能够独立开发和测试,然后组合在一起形成一个健壮的应用程序。

现在我们将了解模型、视图和控制器层的职责。

模型层

  • 模型包含应用程序的业务逻辑。
  • 模型对象实现了应用程序数据域的逻辑。

例如,一个 `Product` 模型对象可能会从数据库检索信息,对其进行操作,然后将更新后的信息写回 SQL Server 数据库中的 `Products` 表。

模型文件类型:类文件(*.cs* 扩展名)

视图层

  • 视图层负责与用户交互
  • 视图有助于可视化模型并与用户进行通信
  • 内容类型:HTML/JavaScript/CSS
  • 也可以渲染 JSON、XML、自定义返回类型

视图文件类型:HTML/JavaScript 文件(*.cshtml* 扩展名)

控制器层 - *交通协管员*

  • 控制应用程序流程以及模型和视图之间的交互
  • 控制器是 ASP.NET MVC 应用程序的大脑。请求来自模型层的数据。
  • 控制器本身不执行任何工作。相反,它将工作委托给模型和视图层来完成实际工作。

例如:当用户请求网站上的某些详细信息时,控制器会询问模型应显示哪些数据。然后,它将此数据传递给视图,视图会生成 HTML 并发送到客户端浏览器。

控制器文件类型:类文件(*.cs* 扩展名)

注意:控制器既不直接检索数据,也不生成要发送到浏览器的 HTML,它仅负责协调。

这三个层相互交互的方式是为了实现我们所说的“*关注点分离*”。这意味着应用程序中的每一层都不知道其他层的功能。

它们是独立的,不依赖于彼此来完成工作。因此,它们是*松耦合*的。

创建示例 ASP.NET MVC 应用程序

创建 ASP.NET MVC Web 应用程序的默认 Visual Studio 模板包含一个极其简单的示例应用程序,可用于理解 ASP.NET MVC 应用程序的不同部分。

通过启动 Visual Studio 并选择菜单选项“文件”->“新建”->“项目”,创建一个使用 MVC 模板的新 ASP.NET MVC 应用程序。

在“新建项目”对话框中,在“项目类型”下选择您喜欢的编程语言(Visual Basic 或 C#),然后在“模板”下选择“ASP.NET MVC 3 Web 应用程序”。单击“确定”按钮。

创建新的 ASP.NET MVC 应用程序时,会出现“新建 ASP.NET MVC 项目”对话框(见图)。此对话框允许您在解决方案中选择项目模板——“空白”、“Internet 应用程序”(一个默认的 ASP.NET MVC 3 项目,包含一个使用表单身份验证的帐户控制器)、“Intranet 应用程序”(一个使用 Windows 身份验证的默认 ASP.NET MVC 3 项目)。在“视图引擎”下拉菜单中选择“Internet 应用程序”和“Razor”选项。单击“确定”按钮。新项目将被创建。

现在让我们尝试了解 Visual Studio 为我们创建的解决方案资源管理器及其文件夹。

了解解决方案资源管理器

我将简要解释 Visual Studio 创建的文件夹。

文件夹

目的

Content

包含演示项目的样式表(*.css* 文件)。

控制器

此文件夹包含应用程序的示例控制器,名称为 `AccountController` 和 `HomeController`。`AccountController` 类包含应用程序的登录逻辑。`HomeController` 类包含应用程序启动时默认调用的逻辑。

模型

这是用于数据模型文件。

脚本

这用于脚本文件,例如支持 ASP.NET AJAX 和 jQuery 的脚本文件。

视图

此文件夹包含三个子文件夹:*Account*、*Home* 和 *Shared*。*Account* 文件夹包含用于登录和更改密码的用户界面的视图。*Home* 文件夹包含一个 Index 视图(应用程序的默认起始页)和一个 About 页面视图。*Shared* 文件夹包含应用程序的主母版页视图。

我们在这里创建的示例项目是拍卖网站。

创建模型

模型只不过是一个带有一些数据的类。因此,让我们创建一个模型。

要创建拍卖模型,只需在 *Models* 文件夹中创建一个名为“`Auction`”的类。为此,右键单击 *Models* 文件夹 -> 添加 -> 类。

会出现一个对话框。将类命名为“`Auction`”并单击“添加”按钮。您现在可以在解决方案资源管理器中的 *Models* 文件夹中看到创建的“*Auction.cs*”文件。

现在添加一些定义拍卖的属性。这些属性将携带拍卖数据。您的业务逻辑需要放在这里。

创建如下类

public class Auction
    {
        public long Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string ImageUrl { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public decimal StartPrice { get; set; }
        public decimal CurrentPrice { get; set; }
    }

接下来,我们将看到控制器如何使模型发挥作用。

创建控制器

我们将现在看到如何通过控制器将我们创建的模型暴露给外界。要创建新控制器,只需右键单击“*Controller*”文件夹,然后在“添加”菜单下选择“控制器”。

为控制器起一个合适的名字。这里,我们将它命名为“`AuctionsController`”(确保控制器名称后有“`Controller`”后缀)。此控制器名称将默认出现在 URL 中。

在“模板”下拉菜单下选择“空白控制器”选项。单击“添加”。

我们可以看到 Visual Studio 已创建了一个具有最少代码的控制器。这是一个派生自 `System.Web.Mvc.Controller` 类的类。它还生成了一个“`Index`”方法形式的控制器操作。这也被称为操作方法。我们可以使用这些操作方法将此类公开到 Web。

这是 Visual Studio 在 `Auctions` 控制器内部为我们创建的最少代码。

   public class AuctionsController : Controller
   {     
        // GET: /Auctions/
        public ActionResult Index()
        {
            return View();
        }
    }

控制器操作(此处为“`Index`”)必须返回某种结果,该结果将作为对用户的回复。操作方法返回与操作方法同名的视图的结果。因此,此处操作名称和视图名称都应为“`Index`”。

现在按键盘上的 F5 运行站点。

由于我们在 `Auctions` 控制器中创建了 `Index` 方法,因此访问此页面的 URL 应该是“*https://:59581/Auctions/Index*”。

URL 分解如下:

URL:默认 URL/[ControllerName]/[ActionMethod Name]

您可以看到操作已执行,但 ASP.NET 报告找不到我们请求显示的视图——“`Index`”视图。因此,ASP.NET 抛出服务器错误。“找不到视图‘`index`’或其主视图,或者没有视图引擎支持搜索的位置”。

这是预料之中的,因为我们还没有创建要显示给用户的视图。为了解决这个问题,我们现在将创建要显示的视图。

创建视图

在上一步中,我们看到了由于 `Index` 视图不存在而显示的错误。请注意,这里我们正在创建一个与控制器中的操作方法对应的视图。

(视图名称和控制器操作名称应相同。此处为 `Index()` 操作方法和 Index 视图)。因此,我们在此处创建一个“`Index`”视图。为此,只需右键单击您希望为其创建视图的控制器操作方法,然后选择“添加视图…”选项。

出现一个带有创建视图各种选项的对话框。但目前,我们将保留默认值并继续。将视图命名为“`Index`”并单击“添加”。

Visual Studio 现在将为我们创建一个基本视图,并立即打开它。在这个视图中,我们将添加我们想要显示给用户的内容。目前,它只包含一行要显示的 HTML。暂时,我们不会在此 HTML 中添加更多内容。

视图如下

@{
    ViewBag.Title = "Home Page";
}
<h2>My Index Page</h2>

要查看此视图的实际效果,请按 F5 或单击 Visual Studio 中的“运行”来运行项目。项目将执行到默认 URL。由于我们已经创建了视图,因此可以通过在默认 URL 之后输入 [ControllerName] / [ActionName or View Name] 来导航到索引视图。

在此,https://:59581/Auctions/Index

现在您可以看到页面已成功渲染,因为 ASP.NET 找到了我们刚刚创建的视图。我们可以通过编辑视图中的 HTML 然后在浏览器中刷新视图来验证此视图。更改将反映在视图中。

请求路由

到目前为止,我们已经了解了模型、视图、控制器或 MVC 的核心组件。还有一个同样重要的组件。它非常重要,以至于应用程序无法在没有它的情况下运行。此组件称为路由或请求路由。

路由的概念很简单。它的作用是检查传入的 URL,以确定它对应于哪个控制器操作,然后将执行传递给该控制器操作。其他 Web 框架会在 URL 中公开页面的路径,但这在 ASP.NET MVC 中并非如此。这是因为处理用户请求的是控制器操作而不是 Web 页面。因此,告知路由层如何读取传入的 URL 并将其映射到正确的控制器操作非常重要。

在 ASP.NET MVC 中,这发生在应用程序首次启动时,在“`Global.asax.cs`”文件中的 `Applicaion_Start()` 方法中。代码如下

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }

此方法调用 `RegisterRoutes()` 方法,该方法遵循关注点分离原则,位于“`App_Start`”文件夹中的名为“`RouteConfig`”的单独类中。打开 `RouteConfig` 以查找 `RegisterRoutes()` 方法。代码如下

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", 
                action = "Index", id = UrlParameter.Optional }
            );
        }

`Routes.IgnoreRoute()`:告诉路由组件忽略任何与给定模式匹配的 URL,而是让核心 ASP.NET 处理它们。

`Routes.MapRoute()`:这会创建一个名为“`Default`”的新路由,如代码所示,并指定将 URL 分解为三个段——控制器、操作和 id 的 URL 模式。然后,我们为已定义的 URL 段提供一些默认值,当该特定段未提供时使用。在这种情况下,我们默认为“`Home`”控制器上的“`Index`”操作,并将“`id`”参数设为可选。

要进行测试,请输入 URL,在本例中为“https://:59581/Auctions/Index/1”。

这会将我们带到所需的视图,即使我们在之前的运行操作中没有输入 id。

结论

至此,我们了解了 Microsoft ASP.NET MVC 及其目的。我们还了解了 MVC 各个组件的职责。然后,为了获得实践经验,我们创建了一个示例 ASP.NET MVC 3 应用程序,并理解了代码和应用程序流程。我希望这能帮助读者通过理解基础知识来开始使用 ASP.NET MVC。

参考文献

© . All rights reserved.