本系列目录: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. 《Entity Framework 6 Recipes》中文翻译系列 (39) ------ 第七章 使用对象服务之配置模型和使用单复数服务

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-3  配置模型 问题 你想了解配置模型中的各种选项. 解决方案 当你添加一个AD ...

  2. Java 浅析内部类

    这篇文章主要讲述Java 内部类的相关知识,主要讲解下面的知识点. 内部类的概念 内部类的特点与使用 多种形式内部类 为什么要使用内部类 内部类的概念 内部类是指在一个类的内部定义了另一个类.例如下面 ...

  3. Fiddler调式使用知多少(一)深入研究

    Fiddler调式使用(一)深入研究 阅读目录 Fiddler的基本概念 如何安装Fiddler 了解下Fiddler用户界面 理解不同图标和颜色的含义 web session的常用的快捷键 了解we ...

  4. WebDriver--简单的元素操作

    以登录163邮箱为例,演示以下几个方法的使用 ①switch_to.frame() ②.clear() ③.send_keys() ④.click() ⑤switch_to_default_conte ...

  5. salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项

    我们都知道,当一条记录进入审批流程以后会自动加锁,apex提供Approval类的lock和unlock方法可以让我们使用代码对记录进行加锁和解锁. 项目中遇到一个需求,需要当某种情况下对记录进行先解 ...

  6. iOS-在团队开发过程中控制代码版本

    Cornerstone Svn简单使用指南: -- what if 负责编写 一.安装并拷贝项目 1.第一步:安装svn.2.第二步:第一个使用svn,找到“Check Out Working Cop ...

  7. Android笔记——提升ListView的运行效率

    之所以说 ListView 这个控件很难用,就是因为它有很多的细节可以优化,其中运行效率就是很重要的一点.目前我们ListView 的运行效率是很低的,因为在 FruitAdapter 的getVie ...

  8. react Props 验证 propTypes,

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  9. Sql Server系列:Insert语句

    1 INSERT语法 [ WITH <common_table_expression> [ ,...n ] ] INSERT { [ TOP ( expression ) [ PERCEN ...

  10. 【转】Linq Group by

    http://www.cnblogs.com/death029/archive/2011/07/23/2114877.html 1.简单形式: var q = from p in db.Product ...