authour: chenboyi
updatetime: 2015-04-25 12:22:35
friendly link:  

目录:

1,思维导图

2,控制器约定

3,action向视图传值的4中方式

4,ActionResult子类演示

5,获取参数的方式 (get/post)

6,在action中设置session和获取session

7,默认控制器工厂


1,思维导图:

2,控制器约定

  1、控制器的后缀名一定是 Controller 结尾

  2、控制器必须继承Controller 父类
      3、方法控制器下的方法会去查询其Views文件夹下的和控制器同名目录下的和action同名的视图
      4、控制器中的action方法一定是public,否则会抛出404异常

  5、action方法可以返回基本的类型 和 void

  6、action方法返回一个类的对象的完全限定名

3,action向视图传值的4中方式:

  3.1.ViewData[]

  ViewData["list"] = list;

  CodeSimple:

  

 1 #region 1.0 通过ViewData向视图进行传值
2 public ActionResult Index()
3 {
4 //1.0 直接构造一个groupinf的list集合
5 List<GroupInfo> list = GetGlist();
6
7 //2.0 action向 视图传参
8 #region 2.0.1 通过ViewData["list"] 来传递
          ViewData["list"] = list;
10 #endregion 11 12 return View(); 13  } 14 #endregion

  3.2,ViewBag.x

  注意:ViewBag.x的本质是通过ViewData["x"]来传递的
  所以如果ViewBag.x 中的属性x 赋值之前已经通过viewdata["x"] 赋值了,则
  前一次的值会被后面的值覆盖

  CodeSimple:

  

 1 #region 3.0 通过ViewBag向视图进行传值
2
3 public ActionResult Index3()
4 {
5 string now = DateTime.Now.ToString();
6
7 //2.0 通过给ViewBag 动态添加一个now的属性进行传值
8 ViewBag.now = now;
9
10 return View();
11 }
12
13 #endregion

  3.3 TempData[]

    CodeSimple:

1 public ActionResult Index2()
2 {
3 string str = "通过TempData传值";
4
5 //2.0 通过TempData 进行传值
6 TempData["str"] = str;
7
8 return View();
9 }

      3.4 View(object model)

    注意:View()通过Model传递给视图页面的 ,所以在.cshtml中是用Model来接收的

    CodeSimple:

 1  #region 4.0 通过View()方法向视图进行传值
2
3 public ActionResult Index4()
4 {
5 GroupInfo ginfo = new GroupInfo() { GroupID = 1, GroupName = "老板" };
6
7 //通过View()方法向视图进行传值
8 return View(ginfo);
9 }
10
11 #endregion

  3.5 向视图传递多个值

  CodeSimple:


 public ActionResult Index5()
{
//注意:ViewData,TempData,ViewBag可以传递任何类型的值到视图
//1.0 将名字传递到视图
ViewData["name"] = "八戒"; //2.0 将年龄传递给图
//ViewData["age"] = "八戒";
TempData["age"] = ; //3.0 将性别传递到视图
ViewBag.Gender = "男"; //4.0
ViewBag.name = "唐僧"; ViewBag.age = ; return View();
}

  3.6 注意点

 ViewBag 本质上使用的是ViewData来传递的,所以ViewBag和ViewData存在相同key,那么后面那个的值会覆盖前面那个的值.
  view():本质上返回的是ViewResult,而ViewResult的父类是ViewResultBase,ViewResultBase 继承actionresult抽象类,所以能够在一个action中通过return view() 满足方法的返回值是ActionRsult的要求.
  action向视图传值的本质:是通过视图引擎将ViewResult对象实例传递给WebViewPage<Tmodel> 中的 Model 和 ViewData

4,ActionResult子类演示:

  ps:返回值类型推荐使用ActionResult做为返回值,而不是使用void和基本类型

  4.1 ViewResult(MVC开发中用的最多)

  ViewResult的父类是ViewResultBase,ViewResultBase 继承actionresult抽象类,所以能够在一个action中通过return view() 满足方法的返回值是ActionResult的要求.

  指定返回视图的几种方式:

    return View();

    return View("当前方法所在的控制器同名的文件夹下的视图名称");

    return View("/Views/Home/Index.cshtml");

    return View(obj);

    return View("当前方法所在的控制器同名的文件夹下的视图名称",obj)

  CodeSimple:

  public ActionResult TargetViewNameDemo()
{
//1.0 去views文件夹下查找和当前方法名称同名的视图
// return View();
//2.0 去当前方法所在的控制器同名的文件夹下查找指定的 indexto.cshtml视图
// return View("indexto"); //3.0 将 Views/Home/index.cshtml视图返回
// return View("/Views/Home/Index.cshtml"); //4.0 将TargetViewName 文件夹下的indexto视图返回,同时向indexto.cshtml上传入一个对象
return View("indexto", new Dog() { uname = "小黑黑" });
}

  4.2 ContentResult

    返回内容之用(特点,可以不需要有对应的视图)

    CodeSimple:

 #region 1.0 ActionResult 子类 ContentResult 演示

         public ActionResult ContentResultDemo()
{
return Content("服务器时间=" + DateTime.Now);
} public ActionResult ContentResultjsDemo()
{
return Content("<script>alert('我被执行啦!!!')</script>");
} public void ContentResultjsDemo1()
{
Response.Write("<script>alert('我被执行啦!!!')</script>");
} #endregion

  4.3 EmptyResult

  CodeSimple:

 #region 2.0 EmptyResult () 演示

         public ActionResult EmptyResultDemo()
{
return new EmptyResult();
} #endregion

  4.4 FileResult

  可以用作画验证码,也可以利用它来实现文件的下载

  CodeSimple:

 1 #region 3.0 FileResult  ()  演示 (验证码制作)
2
3 public ActionResult FileResultDemo()
4 {
5 byte[] imgbuffer;
6 //1.0 实例化image对象
7 using (Image img = new Bitmap(65, 25))
8 {
9 //2.0 获取验证码
10 string vcode = "ab23";
11
12 //3.0 将验证码存入session
13 Session["vcode"] = vcode;
14
15 //4.0 将验证码字符串画到图片上
16 using (Graphics g = Graphics.FromImage(img))
17 {
18 //4.0.1 以白色背景填充位图
19 g.Clear(Color.White);
20
21 //4.0.2 画字符
22 g.DrawString(vcode, new Font("黑体", 16), new SolidBrush(Color.Red), 0, 0);
23 }
24
25 //5.0 将图片的流输出到imgbuffer中
26 using (MemoryStream ms = new MemoryStream())
27 {
28 //5.0.1 将当前图片的流保存到ms中
29 img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
30
31 //5.0.2 将ms转换成byte【】数组
32 imgbuffer = ms.ToArray();
33 }
34 }
35 return File(imgbuffer, "image/jpeg");
36 }
37 #endregion

  4.5 JsonResult

  可以用作ajax请求 ,注意:如果是get请求,则一定是要在Json()中写入:JsonRequestBehavior.AllowGet

  CodeSimple:

 #region 4.0 JsonResult() 输出json格式字符串 演示

         public ActionResult JsonResultDemo()
{
//JsonResult会自动将对象序列化成json字符串,同时如果是get请求,则要将JsonRequestBehavior 设置成 AllowGet
return Json(new { ID = , Name = "八戒" }, JsonRequestBehavior.AllowGet); //如果浏览器(ajax的异步对象)发送的是post请求,写法如
//return Json(new { ID = 1, Name = "八戒" }); }

  4.6 HttpStatusCodeResult

  用户自己设置需要响应的状态码

  CodeSimple:

   #region 5.0 HttpStatusCodeResult()自定义响应状态码

         public ActionResult HttpStatusCodeResultDemo()
{
//自定义响应状态码为404 :页面找不到 500 :服务器异常 304:缓存 302 :页面跳转 200:正常
return new HttpStatusCodeResult();
} #endregion

  4.6 JavaScriptResult

  注意:JavaScript配合视图中的<script rc="/GroupInfo/JavaScriptResultDemo1">

  CodeSimple:

 #region 6.0 JavaScriptResult 返回一段js脚本,一般配合ajax使用

         public ActionResult ViewResultDemo()
{
return View();
} public ActionResult JavaScriptResultDemo()
{
return JavaScript("alert('我被执行了')");
} #endregion
 html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ViewResultDemo</title>
<script src="/C01ActionResultSubClass/JavaScriptResultDemo"></script>
</head>
<body>
<div>
我是调用JavaScriptResultDemo的视图
</div>
</body>
</html>

    4.7 RedirectResult

  执行页面跳转本质上是在响应报文头中产生了 Location:要跳转的页面的虚拟路径 命令

  CodeSimple:

#region 7.0 RedirectResult()页面跳转

        /// <summary>
/// RedirectResult执行页面跳转的本质还是在响应报文头中添加了 Location指令集,并且将
/// 响应状态码修改成302
/// </summary>
/// <returns></returns>
public ActionResult RedirectResultDemo()
{
return Redirect("/ActionResultSubClass/FileResultDemo");
}

    //等同于
public ActionResult RedirectResultDemo1()
{
Response.Redirect("/ActionResultSubClass/FileResultDemo");
return new EmptyResult();
}
#endregion

    4.8 RedirectToRouteResult

  当系统中路由规则比较多的时候,可以由程序员指定使用哪个路由规则来生成url

  CodeSimple:

  #region 8.0 RedirectToRouteResult()指定路由的页面跳转

         public ActionResult RedirectToRouteResultDemo()
{
//注意:参数可以直接使用匿名类来传递,匿名类中的属性名称一定要和路由规则中的url中的占位符名字保持一致
return RedirectToRoute(new { controller = "Home", action = "Index4", id = });
}

    4.9 RedirectToAction

  CodeSimple:

   #region 9.0RedirectToAction 页面跳转

         public ActionResult RedirectToAction()
{
//跳转到同控制器的另外一个action
//return RedirectToAction("JsonResultDemo"); //跳转到home控制器的index4的action
//return RedirectToAction("Index4", "Home"); // 下面写法生成的结果url: http://localhost:14147/Home/Index/1000
// return RedirectToAction("Index", new { controller = "Home", id = 1000 }); //下面写法生成的结果:http://localhost:14147/
return RedirectToAction("Index", new { controller = "Home" }); }

5,获取参数的方式 (get/post)

  5.1 url传参(get请求)

  CodeSimple:

  #region 1.0 通过 QueryString【】 Params【】来接收url传入的参数
//
// GET: /getparms/ url:locahost/getparms/Index?id=1&name=2
public ActionResult Index()
{
//1.0 通过QueryString
//string id = Request.QueryString["id"];
//string name = Request.QueryString["name"]; //2.0 通过Params
string id = Request.Params["id"];
string name = Request.Params["name"]; ViewData["id"] = id;
ViewBag.name = name; return View();
}
#endregion #region 2.0 通过 路由规则 + 方法参数 来接收url传入的参数
/// <summary>
/// url: locahost/getparms/Index/1/2
/// 利用方法参数值 + 路由规则 来进行值的传递
/// MVC框架底层会智能的根据当前url匹配成功的路由规则来将参数解析出来以后
/// 赋值给当前方法的同名参数
/// </summary>
/// <param name="name"></param>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult Index1(string name, string id)
{
//将浏览器传入的id参数 赋值给ViewBag.id 属性后,由视图引擎转交给视图类
ViewBag.id = id;
TempData["name"] = name; return View();
}
#endregion

  5.2  请求报文体传参(post请求)

      post请求传参,主要有以下几种接受方式:

        通过request.Form["uname"]接收

        使用FormCollection

        通过在action方法中传入实体来接收参数 

      ps:

        在控制器中的一个方法上标记[HttpGet]和[HttpPost]区别:
           [HttpGet]:标记当前action方法只能被浏览器get请求
           [HttpPost]:标记当前action方法只能被浏览器Post请求
           如果一个方法上没有加[HttpGet]和[HttpPost],则表示此方法可以被浏览器get请求也可以post请求,不过默认是get请求     

  CodeSimple:

     #region 1.0 通过传统的 Form[]
//
// GET: /postparms/
[HttpGet] //通过HttpGet 特性 标示当前index方法只处理get请求,但是HttpGet 是默认的,所以可以省略
public ActionResult Index()
{
return View();
} [HttpPost] //通过HttpPost 特性 标示当前index方法只处理post请求
public ActionResult Index(string id)
{
//1.0 通过Form[]接收
string uname = Request.Form["uname"];
string uname1 = Request.Params["uname"]; ViewBag.uname = uname;
ViewBag.uname1 = uname1; return View();
}
#endregion #region 2.0 通过在action方法中的FromCollection 对象来接收 /// <summary>
/// 负责处理get请求
/// </summary>
/// <returns></returns>
public ActionResult index1()
{
return View();
} /// <summary>
/// 负责post请求
/// </summary>
/// <param name="id">和路由规则占位符{id}匹配</param>
/// <param name="forms">接收浏览器提交给服务器的表单集合,此处由于只有一个,可以使用forms[0]来处理</param>
/// <returns></returns>
[HttpPost]
public ActionResult index1(string id, FormCollection forms)
{
string uname = forms["uname"]; //uname=1&uname=2 --> 1,2 //获取表单提交过来的参数
ViewBag.uname = uname;
//id:是获取url传入的参数
ViewBag.ID = id; return View();
} #endregion #region 3.0 通过在action方法中传入实体来接收参数 [HttpGet]
public ActionResult Index3()
{
return View();
} /// <summary>
/// MVC底层会智能的将 请求报文体中的参数 uname=八戒,从pig对象中
/// 找到同名的属性 uname,将“八戒” 赋值给此属性
/// 注意:form表单中的 name属性的值 一定要在index3的Dog对象中有同名的属性,否则不会赋值
/// </summary>
/// <param name="id"></param>
/// <param name="pig"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Index3(string id, Dog dog)
{
return View(dog);
}
#endregion

6,在action中设置session和获取session:

  6.1 设置session

  CodeSimple:

   /// <summary>
/// 负责设置session ,发出get请求的时候设置session
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult SetSession()
{
//1.0 设置session["uname"]
Session["uname"] = "小蛮腰";
return View();
}

  6.2 获取session

  CodeSimple:

   /// <summary>
/// post请求的时候 获取session
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult GetSession()
{
string uname = Session["uname"].ToString();
ViewBag.uname = uname; return View();
}

7,默认控制器工厂:

MVC中的控制器的更多相关文章

  1. MVC中Controller控制器相关技术

    第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...

  2. ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)

    ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构.HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件.在应用程序 ...

  3. spring mvc中的控制器方法中的参数从哪里传进来?

    编写控制器方法的时候很奇怪,spring是怎么知道你控制器方法的参数类型,并且注入正确的对象呢? 比如下面这样 @RequestMapping(value="/register", ...

  4. MVC中从控制器到视图的数据传递方法汇总

    1.ViewData对象概述ViewData是一种字典集合数据,是"视图基类"和"控制器基类"的属性常见用法是在控制器中写入数据,在视图中读取数据ViewDat ...

  5. Spring MVC中前端控制器拦截问题

    <!-- 前端控制器 --> <servlet> <servlet-name>ssm</servlet-name> <servlet-class& ...

  6. MVC中控制器向视图传值的四种方式

    MVC中的控制器向视图传值有四种方式分别是 1 ViewDate  2.ViewBag   3.TempDate  4.Model 下面分别介绍四种传值方式 首先先显示出控制器中的代码 using S ...

  7. ASP.NET MVC 5 04 - 控制器

    PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友 ...

  8. ASP.NET MVC中使用Unity Ioc Container

    写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...

  9. MVC中使用Unity Ioc Container

    ASP.NET MVC中使用Unity Ioc Container   写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...

随机推荐

  1. poj2393

    题目大意: 奶酪工厂 奶牛买了一个奶酪工厂制作全世界有名的Yucky酸奶,在接下来的N周(1<=N<=10000),牛奶的价格和工作将会受到波动例如他将花费C_i (1 <= C_i ...

  2. 【索引】Volume 0. Getting Started

    AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 0. Getting Started 10055 - Hashmat the Brav ...

  3. Prefix.pch的作用和用法

    一般用于放置宏,省去xcode编译的时间 Hello World_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部 ...

  4. SQL Server通过整理索引碎片和重建索引提高速度

    本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...

  5. [转] 学习HTML/JavaScript/PHP 三者的关系以及各自的作用

    1.What is HTML? When you write a normal document using a word processor like Microsoft Word/Office, ...

  6. ios创建的sqlite数据库文件如何从ios模拟器中导出

    为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...

  7. TCO 2015 Round 1B DIV1 500 概率题

    [题意]现在有一些线索,每个线索被发现的概率p[i],如果线索i被知道,那么其他线索也可能会被知道,用vector<string> c给出,c[i][j]='Y'表示知道i这个线索,j这个 ...

  8. 移动端网站或APP点击后出现闪动或灰色背景

    隐藏文本框阴影 input, textarea{-webkit-appearance: @none;} 取消手机点击屏幕时,会出现的灰块 html,body{-webkit-text-size-adj ...

  9. springmvc的几点见解

    @Controller //标注在Bean的类定义处 @RequestMapping //可以标注在类定义处,将Controller和特定请求关联起来. //可以标注在方法签名处,以便进一步对请求进行 ...

  10. lucene查询排序结果原理总结

    参考文章 Lucene3.0结果排序原理+操作+示例 Lucene的排序算法 一句话总结lucene排序算法是什么样的 关键几个概念 参考文档: http://lucene.apache.org/co ...