Asp.Net MVC系列--进阶篇之controller(1)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Asp.Net MVC系列--进阶篇之controller(1),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6233字,纯文字阅读大概需要9分钟。
内容图文
![Asp.Net MVC系列--进阶篇之controller(1)](/upload/InfoBanner/zyjiaocheng/1176/e4d791484a93438eb06dbc7f2118d8b9.jpg)
通过实现接口IController完成一个controller
对于默认的路由:
routes.MapRoute( name: "Default", url:"{controller}/{action}/{id}", defaults: new { controller ="Home", action = "Index", id = UrlParameter.Optional } );
添加controller:
public void Execute(RequestContextrequestContext) { var controller = (string)requestContext.RouteData.Values["controller"]; var action =(string)requestContext.RouteData.Values["action"]; requestContext.HttpContext.Response.Write( string.Format("Controller: {0}, Action: {1}", controller,action)); }
访问controller查看结果:
这是最简单的controller创建方式,但是通常不这样做,因为:
我们拿到的是RequestContext对象,需要手动去生成html写到Response里面返回客户端,代码将很难维护。
集成Controller类完成一个controller
一般的,每当我们新建一个controller,都是自动继承controller类,这个类主要帮我们完成两件事情:
1. 会从路由拿到 requestContext 对象,解析出 action 以及参数,并调用
2. 提供不同的 result ( command 模式),返回给客户端
另外,我们还可以使用filter,完成不同的crosscutting的concern,后面章节会详细介绍。
由于引入了action和result的概念,使得我们的代码更容易单元测试,起码比我们自己继承IController接口,直接操作RequestContext对象容易很多。
controller示例:
public class DerivedController :Controller { public ActionResult Index() { ViewBag.Message = "Hellofrom the DerivedController Index method"; return View("MyView"); } }
View代码:
@{ ViewBag.Title ="MyView"; } <h2>MyView</h2> Message: @ViewBag.Message
代码很简单,就是用Viewbag传值到View显示出来,Controller返回了最常用的result,ViewResult。
从controller获取客户端传值的方式
1. 从context object 直接提取
2. 通过参数传进来(由基类controller完成解析)
3. 通过model binding
context object常用的对象
Request.QueryString |
从Get 请求的url中取 |
Request.Form |
从Post请求的表单取 |
Request.Cookies |
把值放在请求的cookie里带过来 |
RouteData.Route |
从路由表里取注册的路由名 |
RouteData.Values |
从路由表获取路由配置的匿名对象 |
HttpContext.Cache |
应用程序缓存 |
HttpContext.Items |
存储一些值,只在同一请求中使用(可以在httppipeline过程的不同module,handler,以及页面传递值) |
HttpContext.Session |
当前用户的session |
TempData |
存一些临时值,取出后会被自动删除 |
另外,不建议直接从RouteData.Values直接取传来的参数值:
public ActionResult ShowWeatherForecast() { string city =(string)RouteData.Values["city"]; DateTime forDate =DateTime.Parse(Request.Form["forDate"]); return View(forDate); }
建议改写为传参:
public ActionResult ShowWeatherForecast(string city, DateTime forDate) { return View(forDate); }
关于传参,注意:
1. 对于引用类型,如果RouteData没有拿到参数,那么就给null了,如果要避免接收null,可以使用默认参数
2. 对于值类型,如果没有拿到参数,就会抛出异常,因此,建议值类型总提供默认参数,或者使用Nullable类型
例如:
public ActionResult Search(stringquery= "all", int page = 1) { // ...process request... return View(); }
使用Execute Result
Controller的职责:
1. 操作domain model
2. 返回一个合适的result
操作完domainmodel之后,就要给客户端返回result了,不推荐手动去实现IController接口进行Redirect或者直接Response.Write数据给客户端。前面说过了:
1. 直接输出html,或者直接跳转url,降低了可读性和可维护性
2. 很难单元测试
3. 交接很难上手
使用ActionResult
MVC Framework 的controller已经给我们了足够的result类型来返回给客户端完成交互。为了了解ActionResult,先customize一个:
public class CustomRedirectResult: ActionResult { public string Url { get; set; } public override void ExecuteResult(ControllerContextcontext) { string fullUrl =UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect(fullUrl); } }
要customize一个result,需要继承ActionResult,主要实现ExecuteResult方法,MVCFramework给我们了一个controllerContext对象,里面有足够我们需要的信息,以上创建的actionResult功能:指定一个url,拿到controllerContext对象生成一个fullurl,完成跳转。
使用这个result:
public ActionResult ProduceOutput() { if (Server.MachineName == "IORI"){ return new CustomRedirectResult {Url = "/Basic/Index" }; } else { Response.Write("Controller:Derived, Action: ProduceOutput"); return null; } }
常用的result:
ViewResult |
返回一个view,可以指定不同的controller |
ParcialViewResult |
返回部分view |
RedirectToActionResult |
转到另一个action |
RedirectResult |
返回301或者302(permanent) |
JsonResult |
返回js最喜欢的json,常用,尤其当前段打算采用纯js template,或者single page application |
FileResult |
文件result |
ContentResult |
字符串 |
HttpUnauthorizedResult |
401,通常,会自动跳转到登陆页面 |
HttpNotFoundResult |
404 |
返回viewResult时,查找顺序:
1. /Views/<ControllerName>/<ViewName>.aspx
2. /Views/<ControllerName>/<ViewName>.ascx
3. /Views/Shared/<ViewName>.aspx
4. /Views/Shared/<ViewName>.ascx
5. /Views/<ControllerName>/<ViewName>.cshtml
6. /Views/<ControllerName>/<ViewName>.vbhtml
7. /Views/Shared/<ViewName>.cshtml
8. /Views/Shared/<ViewName>.vbhtml
可以看到,mvcframework会先从熟悉的aspx和ascx找起
直接传递路径,返回指定view
public ViewResult Index() { return View("~/Views/Other/Index.cshtml"); }
如果出现类似以上的代码,请思考两个问题:
想要跳转到另一个action?可以考虑使用RedirectToAction
View是否放错了位置?
Action传值到View
Model Object
public ViewResult Index() { DateTime date = DateTime.Now; return View(date); }
View中:
@model DateTime @{ ViewBag.Title ="Index"; } <h2>Index</h2> The day is: @Model.DayOfWeek
ViewBag
public ViewResult Index() { ViewBag.Message ="Hello"; ViewBag.Date = DateTime.Now; return View(); }
View中:
@{ ViewBag.Title ="Index"; } <h2>Index</h2> The day is:@ViewBag.Date.DayOfWeek <p /> The message is: @ViewBag.Message
ViewBag优点:
可以不需要定义类型直接传递,并且可以传递任意个对象
缺点:
错误总是运行时,由于是DynamicObject(实际是DynamicViewDataDictionary继承自DynamicObject,因此是像其他functionlanguage语言一样可以动态扩展的)
跳重定向到指定url
HttpStatusCode : 302(临时重定向)
public RedirectResult Redirect(){ return Redirect("/Example/Index"); }
HttpStatusCode:301 (永久重定向,使用小心,不常用)
public RedirectResult Redirect(){ return RedirectPermanent("/Example/Index"); }
跳转回route
public RedirectToRouteResult Redirect() { return RedirectToRoute(new { controller = "Example", action = "Index", ID = "MyID" }); }
大多数情况,遇到处理不掉的请求,我们起码是可以确定跳转到哪个controller和action的:
public RedirectToRouteResult RedirectToRoute() { return RedirectToAction("Index"); }
可以指定controller:
public RedirectToRouteResult Redirect() { return RedirectToAction("Index", "Basic"); }
Redirection过程中传值
在MVCframework中,理想选择应该是使用TempData:
赋值:
public RedirectToRouteResult RedirectToRoute() { TempData["Message"] ="Hello"; TempData["Date"] =DateTime.Now; return RedirectToAction("Index"); }
取值:
public ViewResult Index() { ViewBag.Message =TempData["Message"]; ViewBag.Date =TempData["Date"]; return View(); }
这个对象的好处是,取完就被标记为removable了,请求完毕会自动清掉。如果想取多次,那么可以使用peek方法(但是还是建议最后一次取了清掉(用索引取)):
TempData.Peek("Date");
另外,笔者还推荐HttpRequest.Items,也是在httppipeline内传值的一个不错的选择。
返回httpstatus code
404 (url 找不到):
public HttpStatusCodeResult StatusCode() { return new HttpStatusCodeResult(404, "URL cannot be serviced"); }
401(访问权限受限):
public HttpStatusCodeResult StatusCode() { return new HttpUnauthorizedResult(); }
原文:http://blog.csdn.net/lan_liang/article/details/23137595
内容总结
以上是互联网集市为您收集整理的Asp.Net MVC系列--进阶篇之controller(1)全部内容,希望文章能够帮你解决Asp.Net MVC系列--进阶篇之controller(1)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。