MVC中的控制器
authour: | chenboyi |
updatetime: | 2015-04-25 12:22:35 |
friendly link: |
目录:
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中的控制器的更多相关文章
- MVC中Controller控制器相关技术
第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...
- ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)
ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构.HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件.在应用程序 ...
- spring mvc中的控制器方法中的参数从哪里传进来?
编写控制器方法的时候很奇怪,spring是怎么知道你控制器方法的参数类型,并且注入正确的对象呢? 比如下面这样 @RequestMapping(value="/register", ...
- MVC中从控制器到视图的数据传递方法汇总
1.ViewData对象概述ViewData是一种字典集合数据,是"视图基类"和"控制器基类"的属性常见用法是在控制器中写入数据,在视图中读取数据ViewDat ...
- Spring MVC中前端控制器拦截问题
<!-- 前端控制器 --> <servlet> <servlet-name>ssm</servlet-name> <servlet-class& ...
- MVC中控制器向视图传值的四种方式
MVC中的控制器向视图传值有四种方式分别是 1 ViewDate 2.ViewBag 3.TempDate 4.Model 下面分别介绍四种传值方式 首先先显示出控制器中的代码 using S ...
- ASP.NET MVC 5 04 - 控制器
PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友 ...
- ASP.NET MVC中使用Unity Ioc Container
写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始化 后记 关于Unity的使用可以参照<Unity依赖注入使用详解 ...
- MVC中使用Unity Ioc Container
ASP.NET MVC中使用Unity Ioc Container 写在前面 安装Unity 添加服务层 IArticleRepository类型映射 服务注入到控制器 Global.asax初始 ...
随机推荐
- poj2393
题目大意: 奶酪工厂 奶牛买了一个奶酪工厂制作全世界有名的Yucky酸奶,在接下来的N周(1<=N<=10000),牛奶的价格和工作将会受到波动例如他将花费C_i (1 <= C_i ...
- 【索引】Volume 0. Getting Started
AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 0. Getting Started 10055 - Hashmat the Brav ...
- Prefix.pch的作用和用法
一般用于放置宏,省去xcode编译的时间 Hello World_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部 ...
- SQL Server通过整理索引碎片和重建索引提高速度
本文章转载:http://database.51cto.com/art/201108/282408.htm SQL Server数据库中,当索引碎片太多时,就会拖慢数据库查询的速度.这时我们可以通过整 ...
- [转] 学习HTML/JavaScript/PHP 三者的关系以及各自的作用
1.What is HTML? When you write a normal document using a word processor like Microsoft Word/Office, ...
- ios创建的sqlite数据库文件如何从ios模拟器中导出
为了验证数据库的结构,有的时候需要使用一些管理工具来直接查看sqlite数据库的内容,在windows下有sqlite3的专用工具下载,而在ios下也可以使用火狐浏览器的插件sqlitemanager ...
- TCO 2015 Round 1B DIV1 500 概率题
[题意]现在有一些线索,每个线索被发现的概率p[i],如果线索i被知道,那么其他线索也可能会被知道,用vector<string> c给出,c[i][j]='Y'表示知道i这个线索,j这个 ...
- 移动端网站或APP点击后出现闪动或灰色背景
隐藏文本框阴影 input, textarea{-webkit-appearance: @none;} 取消手机点击屏幕时,会出现的灰块 html,body{-webkit-text-size-adj ...
- springmvc的几点见解
@Controller //标注在Bean的类定义处 @RequestMapping //可以标注在类定义处,将Controller和特定请求关联起来. //可以标注在方法签名处,以便进一步对请求进行 ...
- lucene查询排序结果原理总结
参考文章 Lucene3.0结果排序原理+操作+示例 Lucene的排序算法 一句话总结lucene排序算法是什么样的 关键几个概念 参考文档: http://lucene.apache.org/co ...