(.NET进阶六)Controller/Action三个特征/隐式动作类型

一、控制器

  1. 控制器角色
    1. 中转作用
      1. 承上启下,根据用户输入,执行响应行为(动作方法)
      2. 在行为中调用模型的业务逻辑,返回给用户结果(视图)
    2. 中介角色
      1. 分离视图和模型,让视图和模型各司其职,控制器负责二者交互
      2. 只负责数据传送,不负责处理
  2. 控制器类
    1. 所有控制器的基类都是Controller
    2. Controller类位于System.Web.Mvc命名空间,继承自ControllerBase类
    3. ControllerBase类实现了Icontroller接口中的Execute方法,在路由器搜索到相应的控制器后,就会调用Execute方法进入控制器的处理
  3. ControllerBase类
    1. 属性
      1. ControllerContext:获取或者设置控制器上下文
      2. ValidateRequest:获取或设置一个值,该值指示是否为此请求启用请求验证
      3. ValueProvider:获取或设置控制器的值
      4. ViewData:获取或设置数据的字典
      5. ViewBag:获取动态视图数据字典
      6. TempData:获取或设置可以在不同控制器之间传递数据的字典
    2. 任务
      1. 定位:找到对应的动作方法
      2. 获取参数:获取动作方法的参数
      3. 处理错误:在执行动作方法中可能出现的错误
      4. 渲染视图:提供默认的WebFormViewFactory类来渲染ASP.NET视图

二、动作方法的参数与模型映射

  1. 获取URL和表单数据
    //在动作方法中获取URL和表单数据并处理
    public ActionResult GetList()
    {
        //获取提交的数据
        string className = Request.Params["className"];
        //获取数据
        string stuId = Request.QueryString["stuId"];
        //数据处理.......
        List<Student> stuList = new StudentManage().GetStudentsByClass(className);
    }
    
                                     |
                                     |
                                     ↓
    
    //在动作方法中使用"参数映射"
    public ActionResult GetList(string className)
    {
        List<Student> stuList = new StudentManage().GetStudentsByClass(className);
        //参数进行了自动映射,参数名称与视图中的参数名称必须一致,不区分大小写,参数类型也要相同
    }

    参数映射的好处:不需要手工获取参数并作类型转换,在多个参数是非常明显

  2. 参数映射的优先级

    1. 表单数据 > 路由数据 > URL数据
    2. 参数名要和目标数据参数名一致(不区分大小写)
    3. 参数数据类型要和来源数据类型一致
    4. 参数映射失败解决方法:将值类型定义为可为空类型,可选参数,如 int?等等
  3. 映射模型
    1. 基本步骤:
      1. 获取表单数据
      2. 构造实体模型
      3. 调用业务逻辑方法并传递模型
        public ActionResult Edit()
        {
            Student object = new Student()
            {
                StudentId = Convert.ToInt32(Request.Params["stuId"]),
                StudentName = Request.Params["stuName"],
                Birthday = Convert.ToDateTime(Request.Params["birthday"]),
                ....
                ...
            };
            int result = new StudentManage().ModifyStudent(object);
            return View();
        }
        
        
                                        |
                                        |
                                        ↓
        //映射实体
        public ActionResult Edit(Student object)
        {
            //需要在视图中将视图中name属性名设置的和实体属性名称相同,
            //且视图要为强类型视图,则可以直接映射实体对象
            int result = new StudentManage().ModifyStudent(object);
            return View();
        }

         

三、动作方法特性与ActionResult

  1. 动作方法的同名问题
    1. 重载一个控制器动作方法
      public ActionResult GetList(string className)
      {
          List<Student> stuList = new StudentManage().GetStudentsByClass(className);
          return View();
      }
      
      
      
      
      public ActionResult GetList()
      {
          //获取提交的数据
          string className = Request.Params["className"];
          //获取数据
          string stuId = Request.QueryString["stuId"];
          //数据处理.......
          List<Student> stuList = new StudentManage().GetStudentsByClass(className);
      }
      
      
      //路由系统不能根据方法参数取定位动作方法

       

    2. 解决方法
      1. HTTP请求谓词方法:针对请求类型定位方法,解决同名冲突问题
        1. 关于Http谓词
          1. 特点:经常使用,如果不加上该特性,默认动作方法接收所有谓词请求
          2. 一般开发中都会加上谓词,限定请求谓词类型
            特性名说明
            HttpGet针对Get请求
            HttpPost针对Post请求
            HttpDelete针对Delete请求
            HttpPut针对Put请求
            [HttpPost]//请求谓词
            public ActionResult GetList(string className)
            {
                List<Student> stuList = new StudentManage().GetStudentsByClass(className);
                return View();
            }
            
            
            
            [HttpGet]//请求谓词
            public ActionResult GetList()
            {
                //获取提交的数据
                string className = Request.Params["className"];
                //获取数据
                string stuId = Request.QueryString["stuId"];
                //数据处理.......
                List<Student> stuList = new StudentManage().GetStudentsByClass(className);
            }

             

      2. NonAction特性
        1. 可以将控制器中的方法声明为"非动作方法"
        2. 对于控制器内部使用的方法非常有用,加上该特性后,外部不能访问,即可解决同名冲突问题
          [NonAction]
          public ActionResult GetList()
          {
              //获取提交的数据
              string className = Request.Params["className"];
              //获取数据
              string stuId = Request.QueryString["stuId"];
              //数据处理.......
              List<Student> stuList = new StudentManage().GetStudentsByClass(className);
          }

           

      3. ActionName特性
        1. 为动作方法"重新命名",解决同名冲突问题
        2. 视同中使用时,需要修改成"重新命名"后的方法
        3. 特别注意:当动作方法应用了ActionName特性后,如果动作方法内部使用View()方法调用视图(也就是不指定视图名称),则调用的是和ActionName设置值同名的视图
          [ActionName("GetAllList")]
          public ActionResult GetList()
          {
              //获取提交的数据
              string className = Request.Params["className"];
              //获取数据
              string stuId = Request.QueryString["stuId"];
              //数据处理.......
              List<Student> stuList = new StudentManage().GetStudentsByClass(className);
              return View();//如果使用ActionName,返回View()不写参数时候,默认返回ActionName的视图
          }
          
          //视图中调用路径
          <form method="post" action="/Student/GetAllList">
              .....
              ....
              ...
          </form>
  2. ActionResult详解
  3. 隐式动作类型
    1. 动作方法返回类型可以是ActionResult以外的类型
      public int Sum(int num1,int num2)
      {
          int sum = num1 + num2;
          return sum;
      }
      
      public void WriteLog()
      {
          System.IO.File.WriteAllText(@"D:\Syslog.txt","保存文件");
      }

       

    2. 类型说明
      1. int类型 ->ContentResult类型
      2. void -> EmptyResult类型

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值