本系列目录: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

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

小李飞刀
陆小凤
楚留香
谢晓峰
可是,我要告诉你,结果并不是像你想象的那样,而是会显示为这样:
陆小凤
陆小凤
楚留香
谢晓峰
为什么呢?因为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中对应的这几个对象。

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

9、ASP.NET MVC入门到精通——Controller(控制器)的更多相关文章

  1. 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...

  2. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  3. 5、ASP.NET MVC入门到精通——NHibernate代码映射

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一篇NHibernate学习笔记—使用 NHibernate构建一个ASP.NET MVC应用程序 使用的是xml进行orm映射,那么这一 ...

  4. 6、ASP.NET MVC入门到精通——ASP.Net的两种开发方式

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 目前,ASP.NET中两种主流的开发方式是:ASP.NET Webform和ASP.NET MVC.从下图可以看到ASP.NET WebFo ...

  5. 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...

  6. 8、ASP.NET MVC入门到精通——View(视图)

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官 ...

  7. 10、ASP.NET MVC入门到精通——Model(模型)和验证

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...

  8. 12、ASP.NET MVC入门到精通——HtmlHelper

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 HtmlHelper:是为了方便View的开发而产生 HtmlHelper的演变 普通首页超级链接为:<a href="/h ...

  9. 14、ASP.NET MVC入门到精通——Ajax

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Unobtrusive Ajax使用方式(非入侵式) 非入侵式,通俗来讲:就是将嵌入在Html中的JavaScript全部取出来,放在单独的 ...

随机推荐

  1. Linux守护进程之Supervisor

    1. 什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中,每个 ...

  2. js实用篇之String对象

    概述 String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串的包装对象. var s1 = 'abc'; var s2 = new String('abc'); typeof ...

  3. php的函数和数组

    //php函数//1.简单函数//四要素:返回类型,函数名,参数列表,函数体/*function Show(){    echo "hello";}Show();*///2.有返回 ...

  4. 一个美术需求引发的Custom Inspector

    需求 Editor模式下,在运行或者非运行状态下,能够按照指定的变化率来自动改变material中属性数值. 需求分析 如何在Editor模式下获得一个游戏对象及其组件,尤其是在非运行状态下?我们知道 ...

  5. 以Excel 作为Data Source,将data导入db

    将Excel作为数据源,将数据导入db,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个package ...

  6. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  7. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  8. Android之线程池深度剖析

    1.线程池的引入   引入的好处:   1)提升性能.创建和消耗对象费时费CPU资源   2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多.   使用条件:      假设在一台服务器完成一 ...

  9. C# 获取当前月第一天和最后一天 计算两个日期差多少天

    获取当前月的第一天和最后一天 DateTime now = DateTime.Now; DateTime firstDay = ); DateTime lastDay = firstDay.AddMo ...

  10. Android图片处理

    相信做Android开发的小伙伴对于Android图片压缩.裁剪一定有很深的印象,今天我将带领大家一起学习一下这个看着高深莫测的知识,以便再以后的学习.工作中可以帮助到大家. 首先我们看一下这个问题出 ...