ASP.NET MVC5.0 筑基到炼气大圆满一篇就搞定

 

一、ASP.NET MVC 过滤器

ASP.NET MVC框架支持四种不同类型的过滤器:

    • 授权过滤器 - 实现IAuthorizationFilter属性。

    • 动作过滤器 - 实现IActionFilter属性。

    • 结果过滤器 - 实现IResultFilter属性。

    • 异常过滤器 - 实现IExceptionFilter属性。

 

namespace MVCFiltersDemo.Controllers{
   public class HomeController : Controller{
      // GET: Home
        
      [OutputCache(Duration = 15)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
        
      [OutputCache(Duration = 20)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

请求以下URL http:// localhost:62833 / Home / GetCurrentTime,您将收到以下输出。

Localhost GetCurrentTime

如果刷新浏览器,您将看到相同的时间,因为该操作缓存了20秒。20秒后刷新时会更新。

 

自定义过滤器

要创建自己的自定义过滤器,ASP.NET MVC框架提供了一个称为ActionFilterAttribute的基类。该类实现了IActionFilter和IResultFilter接口,并且都从Filter类派生。

让我们来看一下简单的自定义过滤器示例,方法是在ActionFilters的项目中创建一个新的文件夹。添加一个类,右键单击ActionFilters文件夹,然后选择添加→类。

自定义过滤器

在名称字段中输入“MyLogActionFilter”,然后单击“添加”按钮。

该类将派生自ActionFilterAttribute,它是一个基类,并覆盖以下方法。以下是MyLogActionFilter的完整实现。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFiltersDemo.ActionFilters {
   public class MyLogActionFilter : ActionFilterAttribute{
      public override void OnActionExecuting(ResultExecutingContextfilterContext){
         Log("OnActionExecuting", filterContext.RouteData);
      }
		
      public override void OnActionExecuted(ActionExecutedContextfilterContext){
         Log("OnActionExecuted", filterContext.RouteData);
      }
		
      public override void OnResultExecuting(ResultExecutingContextfilterContext){
         Log("OnResultExecuting", filterContext.RouteData);
      }
		
      public override void OnResultExecuted(ResultExecutedContextfilterContext){
         Log("OnResultExecuted", filterContext.RouteData);
      }
		
      private void Log(string methodName, RouteData routeData){
         var controllerName = routeData.Values["controller"];
         var actionName = routeData.Values["action"];
			
         var message = String.Format(
            "{0} controller:{1} action:{2}", methodName, controllerName, actionName);
				
         Debug.WriteLine(message, "Action Filter Log");
      }
   }
}

现在让我们使用以下代码将日志过滤器应用于HomeController。

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   [MyLogActionFilter]
   public class HomeController : Controller{
      // GET: Home
		
      [OutputCache(Duration = 10)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [OutputCache(Duration = 10)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

运行应用程序,然后观察输出窗口。

输出窗口

如上图所示,处理动作的阶段将记录到Visual Studio输出窗口中。

 

二、动作选择器

动作选择器顾名思义就是为控制器action增加属性,不过这种属性的增加是通过添加注释的方式来实现

There are three types of action selector attributes −

  • ActionName
  • NonAction
  • ActionVerbs

行为动词

您可以应用的另一个选择器过滤器是ActionVerbs属性。所以这限制了对特定HttpVerbs的具体操作的指示。您可以使用相同的名称定义两个不同的操作方法,但一个操作方法响应HTTP Get请求,另一个操作方法响应HTTP Post请求。

MVC框架支持以下ActionVerbs。

  • HttpGet
  • HttpPost
  • HttpPut
  • HttpDelete
  • HttpOptions
  • HttpPatch

我们来看一个简单的例子,我们将在其中创建EmployeeController。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      public ActionResult Search(string name = No name Entered”){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
   }
}

现在我们使用以下代码添加具有相同名称的另一个操作方法。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      //public ActionResult Index()
      //{
         // return View();
      //}
		
      public ActionResult Search(string name){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
		
      public ActionResult Search(){
         var input = "Another Search action";
         return Content(input);
      }
   }
}

当您运行此应用程序时,它将给出错误,因为MVC框架无法确定应该为该请求选择哪个操作方法。

让我们使用以下代码使用您要作为响应的操作指定HttpGet ActionVerb。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      //public ActionResult Index()
      //{
         // return View();
      //}
		
      public ActionResult Search(string name){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
		
      [HttpGet]
      public ActionResult Search(){
         var input = "Another Search action";
         return Content(input);
      }
   }
}

当您运行此应用程序时,您将收到以下输出。

另一搜索动作

三、视图

ASP.NET MVC玩的很大,他们居然说在我MVC应用程序里面没有任何页面。这不是睁眼说瞎话么?在mvc应用程序中所有传入的浏览器请求由控制器处理,这些请求映射到控制器处理方法,控制器操作可能返回一个试图,也可能重定向到另一个控制器操作。那么,问题是视图是如何与控制器绑定的呢?

让我们通过创建一个新的ASP.NET MVC项目来看看一个简单的View示例。

步骤1 - 打开Visual Studio,然后单击文件→新建→项目菜单选项。

将打开一个新的项目对话框。

视觉工作室

步骤2 - 从左窗格中,选择模板→Visual C#→Web。

步骤3 - 在中间窗格中,选择ASP.NET Web应用程序。

步骤4 - 在“名称”字段中输入项目名称“MVCViewDemo”,然后单击“确定”继续。您将看到以下对话框,要求您设置ASP.NET项目的初始内容。

MVCViewDemo

步骤5 - 为了简单起见,请选择“空”选项,并在“添加文件夹和核心参考”一节中查看“MVC”复选框,然后单击“确定”。

它将创建一个基本的MVC项目,具有最少的预定义内容。我们现在需要添加控制器。

步骤6 - 右键单击​​解决方案资源管理器中的控制器文件夹,然后选择添加→控制器。

它将显示“添加脚手架”对话框。

控制器文件夹

步骤7 - 选择MVC 5控制器 - 空选项,然后单击“添加”按钮。

将显示“添加控制器”对话框。

添加控制器对话框

步骤8 - 将名称设置为HomeController,然后单击“添加”按钮。

您将在Controllers文件夹中看到一个新的C#文件“HomeController.cs”,该文件夹也可以在Visual Studio中打开编辑。

我们来更新HomeController.cs文件,其中包含两个操作方法,如下面的代码所示。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCViewDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public ActionResult Index(){
         return View();
      }
		
      public string Mycontroller(){
         return "Hi, I am a controller";
      }
   }
}

步骤9 - 在浏览器中运行此应用程序并将/ Home / MyController运行到URL,然后按Enter键。您将收到以下输出。

MyController

由于MyController动作只返回字符string,要从动作返回一个View,我们需要先添加一个View。

步骤10 - 在添加视图之前,我们再添加另一个操作,这将返回默认视图。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCViewDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public ActionResult Index(){
         return View();
      }
		
      public string Mycontroller(){
         return "Hi, I am a controller";
      }
		
      public ActionResult MyView(){
         return View();
      }
   }
}

步骤11 - 在浏览器中运行此应用程序并将/ Home / MyView添加到URL中,然后按Enter键。您将收到以下输出。

MyView视图

你可以在这里看到我们有一个错误,这个错误实际上是非常描述性的,这告诉我们它找不到MyView视图。

步骤12 - 要添加视图,请右键单击MyView操作,然后选择添加视图。

MyView动作

它将显示“添加视图”对话框,它将添加默认名称。

添加视图对话框

步骤13 - 取消选中“使用布局页面”复选框,然后单击“添加”按钮。

我们现在看到默认的代码。

使用布局页面

步骤14 - 使用以下代码在此视图中添加一些文本。

@{
   Layout = null;
}

<!DOCTYPE html>
<html>
   <head>
      <meta name = "viewport" content = "width = device-width" />
      <title>MyView</title>
   </head>
	
   <body>
      <div>
         Hi, I am a view
      </div>
   </body>
	
</html>

步骤15 - 运行此应用程序并将/ Home / MyView添加到浏览器中的URL。按回车,您将收到以下输出。

我是看

您现在可以看到视图中的文本。

posted @ 2023-06-09 11:25  GroundSoft  阅读(81)  评论(0编辑  收藏  举报