Controller基础

一. 访问修饰符

1.1 类的访问修饰符

Controller类的访问修饰符必须是public,url才能被拦截。

internal能编译通过,但无法拦截url请求。private、protected、protected internal不能通过编译。

1.2 方法的访问修饰符

Controller中方法的访问修饰符必须是public,url才能被拦截。其它类型的访问修饰符会使该方法无法拦截url请求。

二. 特性

可使用的特性有很多,这里只描述常用的一些特性,同样,类和方法的可使用特性分别描述。

2.1 类可使用特性

2.1.1 Authorize特性(System.Web.Mvc.AuthorizeAttribute)

当然,通常的用法不是直接在Controller上标记这个特性,而是标记自定义特性(继承自AuthorizeAttribute)。通过扩展AuthorizeAttribute,实现权限控制。可以称它为“权限特性”吧。关于Authorize特性,后面会写一篇文章讲述MVC里的权限控制实现。

2.1.2 AllowAnonymous特性(System.Web.Mvc.AllowAnonymousAttribute)

与Authorize特性相对应,表示跳过验证(如果你使用自定义Authorize特性做权限控制的话)。

2.1.3 HandleError特性(System.Web.Mvc.HandleErrorAttribute)

这个特性的含义跟它的名字一样,是用来处理异常信息的。上面的特性标记表示:当UserInfoController类中抛出异常时,MVC将默认显示Error视图(~/Views/Shared目录下)。同样,你可以扩展HandleError特性,实现日志记录,出错友好提示等功能。

2.1.4 ValidateAntiForgeryToken特性(System.Web.Mvc.ValidateAntiForgeryTokenAttribute)

此特性用于阻止CSRF(跨站请求伪造)攻击。现在没有证据表明这个特性一定对CSRF攻击有效,本人在此保留意见。

如果以上MVC类使用特性没有列举出您经常使用的特性之一,还请不吝赐教,留言给我。在此感谢~

2.2 方法可使用特性

2.2.1 ActionName特性(System.Web.Mvc.ActionNameAttribute)

此特性用于指定Action的名称。如上图例,被此特性标记后,url拦截的action名称将是Default,而不是Index。如果你使用View()来返回页面,则MVC会寻找Default.cshtml,而不是Index.cshtml。如果你想指定View,则要使用View("viewName")这样的方法。

2.2.2 NonAction特性(System.Web.Mvc.NonActionAttribute)

此特性用于标记Action无效,被标记的Action将无法拦截url请求(普通方法)。将访问修饰符换成private也可以实现类似效果。

2.2.3 HttpGet,HttpPost,HttpDelete,HttpPut特性(System.Web.Mvc.xxxAttribute...)

限制操作方法仅处理对应的Http请求。

2.2.4 Bind特性(System.Web.Mvc.BindAttribute)

此特性用于限制绑定字段,Bind特性的参数有三个:Prefix前缀,Include包含,Exclude排除。

三. Action的参数和返回值

3.1 参数

比如常用信息列表的编辑功能的Action,代码如下:

        public ActionResult Edit(string id = "")
{
UserInfoViewModel model = CoreDBContext.GetModelByID(id);
return View("Detail",model);
}

前端调用代码(Razor视图引擎):

@Html.ActionLink("编辑", "Edit", "UserInfo", new { id=item.UserID.ToString() },null)

如果Edit方法(Action)的参数有多个,而前端传值只传递了一个,那么Action接收值的是第一个参数,如果参数类型不匹配,则会报错。

3.2 返回值

如3.1中的Edit方法,返回值类型是ActionResult,而代码返回的是View视图,即ViewResult。因为ViewResult的最终父类也是ActionResult,所以这样并没有问题。这里返回的View视图即Detail.cshtml,是一个Razor引擎渲染的页面文件。

实际应用中,Action返回值不一定是ActionResult,可以是json,可以是自定义html字符串,也可以返回类型为空,然后使用RedirectToAction方法转到另一个Action中继续处理。

Controller扩展

BaseController ? BusinessController<B, T> ?

一般来说,我们会在MVC项目中使用泛型+虚方法,抽取出通用操作,让具体的业务类继承这些基类型,达到代码的简化。典型的,实体类的增删改查,可以被抽取出来。

public class BusinessController<B,T> : BaseController
where B : class
where T : class,new()
{
public virtual ActionResult Index()
{
return View();
} public virtual ActionResult Insert(T info)
{
if (info != null)
{
//result = baseBLL.Insert(info);
}
return Content(string.Empty);
}
}

具体业务类

    public class UserController : BusinessController<UserBLL, UserInfoViewModel>
{
//...
}

这样的机制在WebForms中是标准的设计结构。对于软件架构,关于"类型"的设计思想,永远是通用的。

异步Controller

异步Controller需要Controller继承AsyncController类(System.Web.Mvc.AsyncController)

public class TimeController : AsyncController
{
//...
}

由于时间仓促,这里不对异步Controller做深究。异步操作本身是个大话题,这里只想让大家有一个概念性的认识。

总结

本章的内容很简单,对Controller类本身的访问限制及可使用特性做了概括性总结,对Controller在项目中的设计提出了一种方案,同时简要提及了异步Controller。

在下一章中,将重点介绍Razor视图引擎。欢迎持续关注~

本文原始地址

ASP.NET MVC 5 Web编程3 -- Controller的应用及扩展的更多相关文章

  1. ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)

    本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...

  2. ASP.NET MVC 5 Web编程1 -- 入门

    开篇引言 说起ASP.NET MVC,我想作为WebForms开发者第一点要问的是:为什么要使用它?我的理解是:MVC是更细节化的框架,“细节可控”意味着你的系统更精致.具体体现在应用上.MVC的出现 ...

  3. ASP.NET MVC 5 Web编程5 -- 页面传值的方式

    本篇文章将讲述MVC的页面传值方式,具体包括:后端向前端传值(Controller向View传值):前端向后端传值(View向Controller传值):Action与Action之间的传值. 回顾 ...

  4. ASP.NET MVC 5 Web编程4 -- Razor视图引擎

    Razor简介 Razor是ASP.NET新增的一个视图引擎,由微软全球最年轻的副总裁,有着"ASP.NET之父"称呼的Scott Guthrie主导的团队开发. 主导Razor开 ...

  5. ASP.NET MVC 4 Web编程

    http://spu.jd.com/11309606.html 第1章 入门第2章 控制器第3章 视图第4章 模型第5章 表单和HTML辅助方法第6章 数据注解和验证第7章 成员资格.授权和安全性第8 ...

  6. MVC 5 Web编程2 -- URL映射

    ASP.NET MVC 5 Web编程2 -- URL映射(路由原理) 2015-02-12 08:50 by hangwei, 704 阅读, 5 评论, 收藏, 编辑 本章将讲述ASP.NET M ...

  7. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway    Phil Haack    Brad Wilson    K. Scott All ...

  8. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)

    继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...

  9. ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

    本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深 ...

随机推荐

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. Java 线程

    线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...

  3. MJRefresh 源码解读 + 使用

    MJRefresh这个刷新控件是一款非常好用的框架,我们在使用一个框架的同时,最好能了解下它的实现原理,不管是根据业务要求在原有的基础上修改代码,还是其他的目的,弄明白作者的思路和代码风格,会受益匪浅 ...

  4. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  5. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  6. PHP 设计模式概述

    一.设计模式(Design pattern)是什么? 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  7. SharePoint 2016 入门视频教程

    之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要 ...

  8. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  9. Android程序中--不能改变的事情

    有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...

  10. Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)

    一. 准备工作 1. 树莓派主板 型号:树莓派3 B型 处理器:四核64位ARM Cortex-A53 CPU 内核架构:ARMv8 2. 一张大于8G的TF卡(本人用的是32G的,也作为PiLFS用 ...