如何在智能告警平台CA触发测试告警
690
2022-09-12
7 天玩转 ASP.NET MVC — 第 7 天(7k7k)
目录
0. 前言
今天是开心的一天。因为我们终于来到了系列学习的最后一节。我相信你喜欢之前的课程,并从中学到了许多。
1. Lab 32 — 让项目有组织性
这个实验确切地讲无关任何新的功能。它只是使项目更有结构性和系统化。
第一步:创建解决方案文件夹
右击解决方案,然后选择 Add -> New Solution Folder。
将文件夹的名称改为「View And Controller」。现在重复这个步骤,创建多个相似的文件夹,分别命名为「Model」,「ViewModel」,「Data Access Layer」。
第二步:创建数据访问层项目
右击 Data Access Layer 文件夹,然后创建一个新的类库项目,命名为「DataAccessLayer」。
第三步:创建业务层和业务实体层项目
在 Model 文件夹下创建两个类库项目,分别命名为「BusinessLayer」 和 「BusinessEntities」。
第四步:创建 ViewModel 项目
在 ViewModel 文件夹下创建一个新的类库项目,命名为「ViewModel」。
第五步:添加引用
首先右击每一个项目,然后选择 Add -> Reference,选择如下引用。
对于 DataAccessLayer,选择 BusinessEntities。对于 BusinessLayer,选择 DataAccessLayer 和 BusinessEntities。对于 MVC Web Application,选择 BusinessLayer,BusinessEntities 和 ViewModel。对于 BusinessEntities,选择 System.ComponentModel.DataAnnotations。
第六步:设置项目
从 MVC 项目中的 DataAccessLayer 文件夹中复制 SalesERPDAL.cs 文件到新创建的 Data Access Layer 类库项目中。
从 MVC 项目中移除 DataAccessLayer 文件夹。从 MVC 项目的 Model 文件夹下复制 Employee.cs,UserDetails.cs 和 UserStatus.cs 文件到新创建的 BusinessEntities 类库项目中。从 MVC 项目的 Model 文件下复制 EmployeeBusinessLayer.cs 文件到新创建的 BusinessLayer 类库项目中。从 MVC 项目中移除 Model 文件夹。从 MVC 项目的 ViewModels 文件夹下复制所有类到新创建的 View Model 类库项目中。从 MVC 项目中移除 ViewModels 文件夹。将 MVC 项目,即 WebApplication1 移到「View And Controller」解决方案文件夹。
第七步:Build 项目
选择菜单栏的 Build -> Build Solution。你将会得到如下的错误信息。
第八步:解决错误
向 ViewModel 项目中添加 System.Web 引用。在 DataAccessLayer 和 BusinessLayer 项目中运用 Nuget Manager,安装 Entity Framework。(如果你对 Nuget Manager 感到困惑,建议你看一下第 3 天的课程)
注:业务层需要引用 Entity Framework 是因为 BusinessLayer 直接与 DataAccessLayer 相关联。在一个正确的架构中,业务层不应该与数据访问层直接关联。我们可以通过 Repository 来完成这个目的。
从 MVC 项目中移除 EntityFramework。
步骤如下。
第九步: Build 解决方案
你将会看到如下错误。
第十步:解决错误
现在,我们在 MVC 项目中既没有 SalesERPDAL 引用,也没有 Entity Framework 引用。添加这些引用不是一个最佳实践。作为最佳实践,控制器不应该与数据访问层直接相关联。
在 DataAccessLayer 项目中创建一个新的类,命名为 DatabaseSettings,它有一个静态方法,命名为 SetDatabase。
using System.Data.Entity; using WebApplication1.DataAccessLayer; namespace DataAccessLayer { public class DatabaseSettings { public static void SetDatabase() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges
在 BusinessLayer 项目中创建一个新的类,命名为 BusinessSettings,它有一个静态方法,命名为 Setbusiness。
using DataAccessLayer;namespace BusinessLayer { public class BusinessSettings { public static void SetBusiness() { DatabaseSettings.SetDatabase(); } }}
在 Global.asax 中运用语句来解决错误,并且移除 Database.SetInitializer 语句。触发 BusinessSettings.SetBusiness 函数。
using BusinessLayer; ......BundleConfig.RegisterBundles(BundleTable.Bundles); BusinessSettings.SetBusiness();
再次 Bulid 应用,这一次将会成功。
Lab 32 的 Q&A
什么是解决方案文件夹?
Solution 文件夹只是逻辑文件夹。实际上,它不会在物理硬盘上被创建。它的目的只是为了让解决方案更加系统化。
2. Lab 33 — 创建单页应用 — Part 1 — 设置
现在,我们将不会对已存在的控制器和视图做出改变。我们将会为此实验创建一个全新的控制器和视图。做这些步骤的理由是:
正如我所说的,我们将会创建新的控制器,视图和视图模型。
只有以下组件会被重复利用。
已存在的 Business Layer。已存在的 Data Access Layer。已存在的 Business Entities。Authentication 和异常过滤器。FooterViewModel。Footer.cshtml。
第一步:创建一个新的 Area
它将在项目中创建一个新的文件夹架构,如下所示。
很明显,我们并不需要 Area 下的 Model 文件夹,删除即可。
什么是 Areas?
Areas 是实现 ASP.NET MVC 项目模块化的一种简单方式。
每一个项目都由多个模块组成。例如:账户模块,顾客关系模块,付款模块,等等。
在传统的应用开发风格中,我们经常使用「Folders」来达到这个目的。我们在一个单独项目中创建多个文件夹。每一个文件夹代表一个模块。我们会把各自模块的文件放在各自的文件夹中。
当使用 ASP.NET MVC 时,这种自定义文件夹将会遇到大问题。
让我们来讨论下在 ASP.NET MVC 中,运用简单的文件夹来实现模块。
DataAccessLayer,BusinessLayer,BusinessEntities 和 ViewModels 不会产生任何问题。他们仅仅是简单的类,所以可以被放置到任意地方。我们不能将控制器随意放置。它必须放置在 Controller 文件夹下。但是这不会成为一个大问题,因为从 MVC 4 开始,控制器的位置限制就已经被舍弃了。现在我们可以将其放置到任意想要放置的地方。不幸的是,对于视图是不可行的。所有的视图都必须放置在「~/Views/ControllerName」或者「~/Views/Shared」文件夹下。
第二步:创建所需的 ViewModels
在 ViewModel 类库项目中创建一个新的文件夹,命名为 SPA,然后创建一个 ViewModel,命名为 MainViewModel。
using WebApplication1.ViewModels; namespace WebApplication1.ViewModels.SPA { public class MainViewModel { public string UserName { get; set; } public FooterViewModel FooterData { get; set; }//New Property }}
第三步:创建 Index 行为方法
在 MainController 中引用如下语句。
using WebApplication1.ViewModels.SPA; using OldViewModel=WebApplication1.ViewModels;
在 MainController 中创建一个新的行为方法,命名为 Index。
public ActionResult Index() { MainViewModel v = new MainViewModel(); v.UserName = User.Identity.Name; v.FooterData = new OldViewModel.FooterViewModel(); v.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value v.FooterData.Year = DateTime.Now.Year.ToString(); return View("Index", v);}
正如你所见,为 WebApplication1.ViewModels 命名空间增加了一个 OldViewModels 别名。现在,我们可以使用 OldViewModel.ClassName,而不是 WebApplication1.ViewModels.ClassName。
不指定别名会导致歧义错误。在命名空间 WebApplication1.ViewModels.SPA 和 WebApplication1.ViewModels 中,存在相似的类。
第四步:创建 Index 视图
创建一个与上述 Index 方法相联系的视图。
@using WebApplication1.ViewModels.SPA@model MainViewModel
第五步:执行并测试应用
按下 F5,然后执行应用。完成登录操作,然后导航到 MainController 中的 Index 行为。
Lab 33 的 Q&A
为什么在控制器名称之前需要 SPA 关键字?
在我们的例子中,你可以发现名称为 SpaAreaRegistration.cs 文件,它被放置在「~/Areas/Spa」文件夹下。SpaAreaRegistration 类的 RegisterArea 方法包含如下代码。
context.MapRoute( "SPA_default", "SPA/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional });
这就解释了为什么我们需要在控制器名称前添加 SPA 关键字。
SpaAreaRegistration 类中的 RegisterArea 方法如何被触发?
打开 Global.asax 文件,Application_Start 的第一行如下。
AreaRegistration.RegisterAllAreas();
RegisterAllAreas 方法查找到应用中所有来自于 AreaRegistration 的类型,并调用它们的每一个 RegisterArea 方法。
我们可以不使用 SPA 来触发 MainController 动作吗?
让我们简化一下问题:URL 为「localhost:8870/Main/Index」还会起作用吗?
答案是肯定的。AreaRegistration 类创建一个新的路由,但是不会删除其它路由。路由在 RouteConfig 类中定义,仍然起作用。正如我之前所说的那样,控制器的位置没有限制。因此它仍能起作用,但是输出不会被正确地呈现,因为它将不能查找到视图。我建议你执行一下应用,试一试。
3. Lab 34 — 创建单页应用 — Part 2 — 展示 Employees
第一步:为展示已存在的 Employees 创建 ViewModel
在 ViewModel 类库的 SPA 文件夹下创建两个新的 ViewModel 类,命名为 EmployeeViewModel 和 EmployeeListViewModel。
namespace WebApplication1.ViewModels.SPA { public class EmployeeViewModel { public string EmployeeName { get; set; } public string Salary { get; set; } public string SalaryColor { get; set; } }}
namespace WebApplication1.ViewModels.SPA { public class EmployeeListViewModel { public List
注:两个 ViewModel 实际上都是 Non-Spa 应用的 ViewModel 复制品。唯一的区别是不需要 BaseViewModel 了。
第二步:创建 EmployeeList Index
在 MainController 下创建一个新的行为方法,命名为 EmployeeList。
public ActionResult EmployeeList() { EmployeeListViewModel employeeListViewModel = new EmployeeListViewModel(); EmployeeBusinessLayer empBal = new EmployeeBusinessLayer(); List
注:HeaderFooterFilter 不再需要。
第三步:创建 AddNewLink 分部视图
这次我们不能运用之前的 AddNewLink 分部视图,因为之前的标签设定会导致全部的刷新。我们的目标是创建一个「Single Page Application」,因此我们不应该有全部的刷新。
在「~/Areas/Spa/Views/Main」文件夹下创建一个新的分部视图,命名为 AddNewLink.cshtml。
第四步:创建 AddNewLink 行为方法
在 MainController 下创建一个新的行为方法,命名为 GetAddNewLink。
public ActionResult GetAddNewLink() {if (Convert.ToBoolean(Session["IsAdmin"])) {return PartialView("AddNewLink"); }else {return new EmptyResult(); }}
第五步:创建 EmployeeList 视图
在「~/Areas/Spa/Views/Main」文件夹下创建一个新的分部视图,命名为 EmployeeList。
@using WebApplication1.ViewModels.SPA@model EmployeeListViewModel
Employee Name |
---|
First Name: |
'); var salaryTD = $(' | '); nameTD.text(r.EmployeeName); salaryTD.text(r.Salary); salaryTD.css("background-color", r.SalaryColor); newTr.append(nameTD); newTr.append(salaryTD); $('#EmployeeTable').append(newTr); $('#DivCreateEmployee').dialog('close'); } ); } } |
暂时没有评论,来抢沙发吧~