• 9、ASP.NET MVC入门到精通——Controller(控制器)


    本系列目录:ASP.NET MVC4入门到精通系列目录汇总

    Controller主要负责响应用户的输入。主要关注的是应用程序流,输入数据的处理,以及对相关视图(View)输出数据的提供。

    • 继承自:System.Web.Mvc.Controller
    • 一个Controller可以包含多个Action. 每一个Action都是一个方法, 返回一个ActionResult实例
    • 一个Controller对应一个xxController.cs控制文件,对应在View中有一个xx文件夹。一般情况一个Action对应一个View页面

    Controller Action方法参数与返回值

    Action方法接收参数:
    a.接收浏览器传过来的参数(get-两种格式/post)
       a1.接收FormCollection Request.Form

     1.通过Request.Form["name"] 逐个获取 表单提交的数据

    在View视图中

      @Html.TextBoxFor(x => x.CusName, new { @class = "trade-timen", @id = "cusName" })<span class="wtps">* @Html.ValidationMessageFor(m => m.CusName)

    控制器中

     [HttpPost]
    public string UpdateCustomerInfo(FormCollection form)
    {
    return  Request.Form["CusName"];;
     }

    注意:在View界面要存在name属性为CusName的表单元素,因为提交表单数据的时候,只会提交所有带name标签的数据。

     2.通过 FormCollection form逐个获取 表单提交的数据

    [HttpPost]
    public string UpdateCustomerInfo(FormCollection form) { return form["CusName"];
    }

       a2.接收Model

    通过 实体对象 一次性获取 表单元素的数据,并设置到实体对象对应的属性中

            /// <summary>
            /// 修改客户
            /// </summary>
            /// <param name="info"></param>
            /// <returns></returns>
            [HttpPost]
            public ActionResult UpdateCustomer(CustomerInfo info)
            {
                string msg = string.Empty;
                if (ModelState.IsValid)
                {
                    try
                    {
                        CustomerInfo model = CustomerInfo.Load(info.ID);
                        model.CusCode = info.CusCode;
                        model.CusName = info.CusName;
                        model.Phone = info.Phone;
                        model.Tel = info.Tel;
                        model.Email = info.Email;
                        model.Fax = info.Fax;
                        model.Country = info.Country;
                        model.Address = info.Address;
                        model.CompanyName = info.CompanyName;
                        model.BusssinessType = info.BusssinessType;
                        model.Status = info.Status;
                        model.Update();
                        msg = "修改客户成功。";
                    }
                    catch (Exception ex)
                    {
                        msg = "修改客户失败!" + ex.Message;
                        ViewBag.Msg = string.Format(message, msg, false, "1");
                    }
                    ViewBag.Msg = string.Format(message, msg, true, "0");
                }
                return View();
            }

    注意: 表单中的表单元素的属性名称必须和实体对象的属性一样!

    折叠类中所有方法:ctrl+m+o 

    折叠类中所有的代码块,包括类:ctrl+m+l

    b.接收Get数据,Request.QueryString

    直接通过请求上下文对象里的 Request获取 url ?后的的参数:

      浏览器请求路径为:/User/UserList/1?kjy=jp

      控制器获取:Request.QueryString["kjy"];

    Action方法输出返回值:

    b1.string:直接 返回响应报文字符串;

    b2.ActionResult:返回控制器结果对象
         (里面会包含什么呢?能做什么呢?)

    b3.JsonResult:返回 Json 字符串

    Action的返回值-ActionResult

    Action指定使用视图

    public ActionResult Index()
    {
         return View();//默认情况下不给参数返回和方法同名的视图,即使用视图 Index.cshtml 路径在当前控制器对应的View目录下面
         return View("OtherIndex");//使用 OtherIndex.cshtml
         return View("~/Views/Home/Test.cshtml");
    }

     Controller是如何向View进行数据传输的呢?

    控制器将处理后的数据“传”给视图的方式

    ViewData/ViewBag/TempData/Model

    我们先来看下示例

    控制器代码:

            public ActionResult Index()
            {
                ViewBag.UserName = "小李飞刀";
                ViewData["UserName"] = "陆小凤";
                TempData["UserName"] = "楚留香";//临时数据
    
                User model = new User { UserName = "谢晓峰" };
    
                return View(model); //这行代码其实就相当于ViewData.Model=model
            }

    View代码:

    @{
        ViewBag.Title = "Index";
    }
    
    <div>@ViewBag.UserName </div>
    <div>@ViewData["UserName"] </div>
    <div>@TempData["UserName"] </div>
    <div>@Model.UserName</div>
    Model其实就是ViewData.Model

    大家可能觉得这十分显而易见,结果肯定是

    小李飞刀
    陆小凤
    楚留香
    谢晓峰
    可是,我要告诉你,结果并不是像你想象的那样,而是会显示为这样:
    陆小凤
    陆小凤
    楚留香
    谢晓峰
    为什么呢?因为ViewDataViewBag本质上都是【ViewDataDictionary】类型,并且两者之间的数据共享,只不过提供了不同的语法操作方式而已。
    所以“陆小凤”覆盖了原先的值”小李飞刀“。
    TempData,看名称我们就知道,只用来临时存储的,存储一次就失效了,不会再共享啊什么的。
    打开我一直吐血推荐的犀利工具Reflector,我们来看下源码
    我们看到HomeController : Controller,public abstract class Controller : ControllerBase

    发现,只要从TempData中取出一个元素,就会立即将此元素移除!

    Model 强类型参数

    在控制器里的Action方法最后 调用View加载视图的时候,将 数据对象传入。

    return View(model);

    视图中,可以通过 Model属性获取!并且不需要转型就可以直接使用!

    注意:Model虽然可以不转型就直接使用,但是 因为编译器无法在编译时获取它的类型,所以就无法出现智能提示!为了解决这个问题,我们可以在试图的最上面通过代码指定model类型

     

    查看源码:
    当我们在试图上添加了 @model指令时 

    当前视图就会继承于 WebViewPage<T> 强类型视图页面类,并且指定TStudent
    
    

     如果没有添加@model指令:当前视图就会继承于 WebViewPage<T> 强类型视图页面类,但T变成了 dynamic

    到这里,Controller的数据怎么就传到View了,我明明只给Controller中的ViewData/ViewBag/TempData/赋值了,或者只把对象传给了View方法。

    为什么View中就可以直接调用了呢?我们知道以前的ASP.NET,aspx和aspx.cs是一个继承关系,子类可以直接调用父类的属性方法。你ASP.NET MVC中View和Controller之间又有什么关系呢?

    View和Controller中都有ViewData/ViewBag/TempData这几个对象,在给Controller中这些对象赋值后,Controller会把这些值赋值給View中对应的这几个对象。

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总

  • 相关阅读:
    如何实现对ELK各组件的监控?试试Metricbeat
    Dubbo日志链路追踪TraceId选型
    Spring Security如何优雅的增加OAuth2协议授权模式
    聊一聊:MyBatis和Spring Data JPA的选择问题
    Java微服务 vs Go微服务,究竟谁更强!?
    你一定需要知道的高阶JAVA枚举特性!
    当音乐学博士搞起编程,用一本书改变了Java世界!
    Spring Boot 2.x基础教程:使用Flyway管理数据库版本
    文件上传的单元测试怎么写?
    Spring Boot 2.x基础教程:多个文件的上传
  • 原文地址:https://www.cnblogs.com/jiekzou/p/4780412.html
Copyright © 2020-2023  润新知