一、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,您将收到以下输出。

如果刷新浏览器,您将看到相同的时间,因为该操作缓存了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项目的初始内容。

步骤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动作只返回字符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视图。

步骤12 - 要添加视图,请右键单击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。按回车,您将收到以下输出。

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

 

ASP.NET MVC5.0 筑基到炼气大圆满一篇就搞定的更多相关文章

  1. ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法

    ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用g ...

  2. ASP.NET MVC5.0 OutputCache不起效果

    按照官网文档(https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing ...

  3. IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

    Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...

  4. Asp.Net MVC5入门学习

    添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用来便于我们的开发,要是对MVC概念还有点模糊的 ...

  5. ASP.NET MVC5基础 – MVC文件架构

    创建MVC项目 首先,我们使用Visual Studio2019创建一个MVC架构的应用程序.步骤如下:首先打开VS2019,在启动页选择[创建新项目].然后选择创建 ASP.NET Web 应用程序 ...

  6. ASP.NET MVC5写.php路由匹配时的问题 ASP.NET MVC 4 在 .NET 4.0 与.NET 4.5 的專案範本差異

    由于外包公司结束合作,所以考虑把其APP服务替换过来,因原后台是用php写的,在不影响员客户端使用的情况下在MVC下重写路由配置实现处理原php链接地址的请求,但实现时发现怎么也匹配不到自己写的路由, ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  9. 分享阿里云推荐码 IC1L2A,购买服务器可以直接打9折,另附阿里云服务器部署ASP.NET MVC5关键教程

    阿里云推荐码为:IC1L2A 阿里云还是不错滴. 以windows server 2008 R2为例,介绍如何从全新的服务器部署MVC5 站点. 新购买的阿里云服务器是没有IIS的,要安装IIS: 控 ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

随机推荐

  1. html5与css3新特性

    HTML5新特性 增加了一些新的标签.新的表单以及新的表单属性等 这些新特性都有兼容性问题,基本上IE9+以上版本浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性 新增语义化标签 - < ...

  2. 轻松驾驭Python格式化:5个F-String实用技巧分享

    F-String(格式化字符串字面值)是在Python 3.6中引入的,它是一种非常强大且灵活的字符串格式化方法. 它允许你在字符串中嵌入表达式,这些表达式在运行时会被求值并转换为字符串,这种特性使得 ...

  3. [非常重要] 通过ssh的方式提交github

    通过ssh的方式提交github - 重要文章!!vscode提交github 原因: github的https的clone项目报错,所以改用ssh的方式 1 本地创建ssh秘钥 目录是 .ssh 我 ...

  4. C++串口通讯解决方案

    这篇文章只是笔记性质,没有实际的原创内容,主要是做一下方案的备份. 串口通讯使用开源的 CSerialPort 类,我使用的是Windows版本分支: CSerialPort 跨平台 CSerialP ...

  5. Java递归实现全排列改进(二)---利用ArrayList实现去重

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test{  priv ...

  6. App启动页面优化

    目录介绍 01.存在白屏问题 1.1 问题描述 1.2 问题分析 02.解决白屏的办法 2.1 解决方案分析 2.2 第一种解决方案 2.3 第二种解决方案 2.4 注意要点 03.Applicati ...

  7. Java12版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. 如何用Flask中的Blueprints构建大型Web应用

    本文分享自华为云社区<构建大型Web应用Flask中的Blueprints指南>,作者: 柠檬味拥抱. 什么是Blueprints? Blueprints是Flask中的一种模式,用于将应 ...

  9. SpringBoot RestTemplate 上传文件

    @Test public void testUpload() throws Exception { String url = "http://127.0.0.1/file/upload&qu ...

  10. 可变形卷积系列(三) Deformable Kernels,创意满满的可变形卷积核 | ICLR 2020

    论文提出可变形卷积核(DK)来自适应有效感受域,每次进行卷积操作时都从原卷积中采样出新卷积,是一种新颖的可变形卷积的形式,从实验来看,是之前方法的一种有力的补充.   来源:晓飞的算法工程笔记 公众号 ...