一、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. react build 后,打包后自动将index.html copy 404.html - create-react-app 创建的项目

    起因:build上传gitee,启用路由需要404.html自动跳转 当前环境 create-react-app 搭建的架子 解决方案 由于默认的时候把build.js打包,无法查看,只好eject ...

  2. 恒玄科技BES250解决方案之双耳链接调试总结和源码分析

    一 前言 bes2500芯片在tws耳机应用十分广泛,该芯片有着资源强大,音质好,大厂背书等特色.吸引了不少粉丝跟随. 最近在调试该芯片的tws配对流程,花费了一些时间,踩了一些坑,这里做一个总结和备 ...

  3. FFmpeg命令行之FFmpeg 采集设备

    在使用 FFmpeg 作为编码器时,可以使用FFmpeg采集本地的音视频采集设备的数据,然后进行编码.封装.传输等操作. 例如,我们可以采集摄像头的图像作为视频,采集麦克风的数据作为音频,然后对采集的 ...

  4. 在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

    本文首发于公众号:Hunter后端 原文链接:在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火,可以提供各种问答功能,阿里最 ...

  5. MongoDB4.0.11服务没有响应控制功能解决办法

    如图 MongDB安装好后启动服务失败 解决办法 进入到你的MongDB bin目录下执行 mongod.exe --remove --serviceName "MongoDB" ...

  6. rust使用lazy_static对全局变量多线程并发读写示例

    首先需要在项目依赖Cargo.toml添加lazy_static依赖项 [dependencies] lazy_static = "1.4.0" 示例代码如下: use lazy_ ...

  7. KingbaseES运维案例之---数据库启动“could not open shared memory segment”

    ​ 案例说明: 在kylin系统下数据库启动出现"could not open shared memory segment xxxx"的故障,故障如下所示: 适用版本: Kingb ...

  8. 2024 VEXIQ 赛季笔(游)记 Pt.1

    2024/03/07 老师让我们做机器初步思考了. 搞搞戒指,只要一个小夹子加上赛季的抬升吸环改一下就可以了,方便的一批. 于是夹子 10 分钟不到搞完了,现在是缝合怪时间. 但是老师下课不让我搞了 ...

  9. SpringBoot配置启动页(首页)控制台打印项目访问入口url

    一.SpringBootApplication 1 package com.reliable.yang; 2 3 /** 4 * @author Administrator 5 * @date 202 ...

  10. #期望dp#CF1810G The Maximum Prefix

    洛谷题面 CF1810G 分析 考虑最大前缀和满足两个条件,就是所有前缀和都不超过,以及一定有一个等于. 那么就要保证它能达到最大值且一直不能高于它 设 \(dp[i][j][0/1]\) 表示前 \ ...