ASP.Net MVC Controller(控制器)

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

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

小李飞刀

陆小凤

楚留香

谢晓峰

可是,我要告诉你,结果并不是像你想象的那样,而是会显示为这样:

陆小凤

陆小凤

楚留香

谢晓峰

为什么呢?因为ViewData和ViewBag本质上都是【ViewDataDictionary】类型,并且两者之间的数据共享,只不过提供了不同的语法操作方式而已。

所以“陆小凤”覆盖了原先的值”小李飞刀“。

TempData,看名称我们就知道,只用来临时存储的,存储一次就失效了,不会再共享啊什么的。

打开我一直吐血推荐的犀利工具Reflector,我们来看下源码

我们看到HomeController : Controller,public abstract class Controller : ControllerBase

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

Model 强类型参数

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

return View(model);

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

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

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

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


如果没有添加@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中对应的这几个对象。

时间: 2024-10-16 06:00:20

ASP.Net MVC Controller(控制器)的相关文章

NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controller的继承体系) 4.ASP.NETMVC IController Factory 控制器工厂(Controller的创建) 1]开篇介绍 经过前一篇文章.NET/ASP.NET Routing路由(深入解析路由系统架构原理) 的讲解,我们对ASP.NETRouting路由系统的整个运行机制有了一个

ASP.NET MVC 5 - 控制器

原文:ASP.NET MVC 5 - 控制器 MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何在ASP.NET MVC 5中使用它

asp.net MVC中控制器获取表单form提交的数据之实体类数据

第一次写记录文章,难免有不足之处:欢迎指出. 1.新建一个mvc项目如: 2.新建一个Test.cs 注意get,set方法不能简写 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using System; using System.Collections.Generic; using System.Linq; usi

[转]ASP.NET MVC 5 - 控制器

MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何在ASP.NET MVC 5中使用它们来构建应用程序. 首先,让我们创建一个控制器

ASP.NET MVC在控制器中分别用Get和post模式调用天气url返回数据乱码

ASP.NET MVC在控制器分别中用Get和POST模式调用天气url返回数据乱码 !!!已解决,分享分享!!! 感谢大神:Daniel Cai 感谢大神:顾晓北 post方法,本人不知道,如果有大神知道,请指导!! //用UTF-8转码有汉字参数的url protected string UrlUtf_8(string url) { byte[] bs = Encoding.GetEncoding("UTF-8").GetBytes(url); StringBuilder sb =

ASP.NET MVC 04 - 控制器

PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友好好装装逼啊是不.哈哈. 本篇目录: 1. 控制器的角色 1.1 控制器简史 2. 控制器基础 2.1 简单示例:HomeController 2.2 创建第一个控制器 2.2.1 创建新控制器 2.2.2 编写操作方法 2.2.3 经验总结 3. 小结 ▁▃▅ 控制器 ▅▃▁ 本篇将阐述ASP.N

ASP.NET MVC 之控制器与视图之间的数据传递

今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, 如何在控制器中获取,处理这些数据. ASP.NET MVC 中所有控制器都继承Controller类,而Controller又继承自ControllerBase,而ControllerBase下又包含ViewData以及TempData视图数据字典. 一,使用ViewData传递数据 ViewDat

ASP.NET MVC Controller的激活

最近抽空看了一下ASP.NET MVC的部分源码,顺带写篇文章做个笔记以便日后查看. 在UrlRoutingModule模块中,将请求处理程序映射到了MvcHandler中,因此,说起Controller的激活,首先要从MvcHandler入手,MvcHandler实现了三个接口:IHttpAsyncHandler, IHttpHandler, IRequiresSessionState. 其处理逻辑主要实现在同步和异步的ProcessRequest方法中,总的来说,该方法在执行的时候,大致经历

ASP.NET MVC 创建控制器类过程

MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData.GetRequiredString("controller"); 1.2创建控制器类工厂  返回IControllerFactory类型 默认创建的工厂实例为DefaultControllerFactory factory = this.ControllerBuilder.GetContr