zoukankan      html  css  js  c++  java
  • ASP.NET MVC 5 Web编程3 -- Controller的应用及扩展

    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视图引擎。欢迎持续关注~

    本文原始地址

  • 相关阅读:
    浮窗显示到毫秒时间的小工具 各大电商平台的时间
    非常不错的电脑截图软件介绍—截图加贴图。
    ​Everything 文件搜索神器 基于名称实时定位文件和目录
    THUPC2021初赛 & ICPC上海站游记
    旧题重做
    常用思想方法——数学期望篇
    vim 常用操作技巧
    生物制图软件——CirCos在Linux服务器上安装步骤:
    vue-element-admin 改造
    vue
  • 原文地址:https://www.cnblogs.com/hangwei/p/4326132.html
Copyright © 2011-2022 走看看