ASP.NET MVC Controllers and Actions
MVC应用程序里的URL请求是通过控制器Controller处理的,不管是请求视图页面的GET请求,还是传递数据到服务端处理的Post请求都是通过Controller来处理的,先看一个简单的Controlller:
public class DerivedController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Hello from the DerivedController Index method"; //动态数据
return View("MyView"); //指定返回的View
}
}
是个DerivedController,那么对应处理的URL就是这样的:localhost:1042/Derived/Index,并且Index这个Action指定了返回的视图是MyView,而不是同名的Index视图,那么就需要新建一个视图MyView。在Index这个Action方法内右键 - 添加视图 - MyView,或者在解决方案的Views目录下新建一个Derived目录,再右键 - 新建视图 - MyView:
@{
ViewBag.Title = "MyView";
}
<h2>
MyView</h2>
Message: @ViewBag.Message
直接Ctrl+F5运行程序浏览器定位到的url是:localhost:1042,看看路由的定义:
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
注意路由的最后一行:new { controller = "Home", action = "Index", id = UrlParameter.Optional }
都给默认值了,那么URL:localhost:1042 其实就是:localhost:1042/Home/Index id是可选参数。
localhost:1042/Home/Index这个Url找的Controller自然是HomeController,Index对应的是HomeController下的Index这个Action,显然没有HoomeController,自然会报404错。
解决方法:
1.把路由的默认值修改成:
new { controller = "Derived", action = "Index", id = UrlParameter.Optional }
2.在浏览器的url栏里手动输入:localhost:1042/Derived/index
可以通过上下文对象Context取一些参数:
string userName = User.Identity.Name;
string serverName = Server.MachineName;
string clientIP = Request.UserHostAddress;
DateTime dateStamp = HttpContext.Timestamp;
跟普通的WebForm里一样,可以通过Request.Form接收传递过来的参数:
string oldProductName = Request.Form["OldName"];
string newProductName = Request.Form["NewName"];
取URL里/路由的参数:
string city = RouteData.Values["city"].ToString();
给Controller传参:
public ActionResult ShowWeatherForecast(string city, DateTime forDate)
{
ViewBag.City = city;
ViewBag.ForDate = forDate;
return View();
}
对应的a标签是这样的:
@Html.ActionLink("查看天气(传参)", "ShowWeatherForecast", new { city = "北京", forDate = @DateTime.Now })
再添加对应的视图:
@{
Layout = null;
}
要查询的是:@ViewBag.City 的天气,查询的时间是:@ViewBag.ForDate
运行下程序ShowWeatherForecast视图就显示了:
要查询的是:北京 的天气,查询的时间是:2013/11/25 21:08:04
当然也可以不传参但是提供默认值:
@Html.ActionLink("查看天气(默认值) ", "ShowWeatherForecast", new { forDate = @DateTime.Now })
没有传city,看Controller:
public ActionResult ShowWeatherForecast(DateTime forDate, string city = "合肥")
{
ViewBag.City = city;
ViewBag.ForDate = forDate;
return View();
}
视图显示:
要查询的是:合肥 的天气,查询的时间是:2013/11/25 21:16:35
默认值已经起作用了。
控制器里获取路由数据:
public string Index()
{
string controller = (string)RouteData.Values["controller"];
string action = (string)RouteData.Values["action"]; return string.Format("Controller: {0}, Action: {1}", controller, action);
}
自然浏览器就会显示:Controller: Derived, Action: index
Action里实现跳转:
public void Index()
{
Response.Redirect("/Derived/ShowWeatherForecast");
}
使用Response.Redirect实现跳转还比较偏WebForm化,MVC里更应该这么跳转:
public ActionResult Index()
{
return new RedirectResult("/Derived/ShowWeatherForecast");
}
之前都是类似的Action都是Return的View这里却Return的却是RedirectResult,这就得看方法的返回值了,方法的返回值是ActionResult,并不仅仅是ViewResult,可以理解为ActionResult是ViewResult和RedirectResult等等的基类。
这里甚至可以直接返回视图文件的物理路径:
return View("~/Views/Derived/ShowWeatherForecast.cshtml");
常用的Action返回值类型有:


跳转到别的Action:
public RedirectToRouteResult Redirect() {
return RedirectToAction("Index");
}
上面的方法是跳转到当前Controller下的另外一个Action,如果要跳转到别的Controller里的Action:
return RedirectToAction("Index", "MyController");
返回普通的Text数据:
public ContentResult Index() {
string message = "This is plain text";
return Content(message, "text/plain", Encoding.Default);
}
返回XML格式的数据:
public ContentResult XMLData() {
StoryLink[] stories = GetAllStories();
XElement data = new XElement("StoryList", stories.Select(e => {
return new XElement("Story",
new XAttribute("title", e.Title),
new XAttribute("description", e.Description),
new XAttribute("link", e.Url));
}));
return Content(data.ToString(), "text/xml");
}
返回JSON格式的数据(常用):
[HttpPost]
public JsonResult JsonData() { StoryLink[] stories = GetAllStories();
return Json(stories);
}
文件下载:
public FileResult AnnualReport() {
string filename = @"c:\AnnualReport.pdf";
string contentType = "application/pdf";
string downloadName = "AnnualReport2011.pdf";
return File(filename, contentType, downloadName);
}
触发这个Action就会返回一个文件下载提示:

返回HTTP状态码:
//404找不到文件
public HttpStatusCodeResult StatusCode() {
return new HttpStatusCodeResult(, "URL cannot be serviced");
} //404找不到文件
public HttpStatusCodeResult StatusCode() {
return HttpNotFound();
} //401未授权
public HttpStatusCodeResult StatusCode() {
return new HttpUnauthorizedResult();
}
返回RSS订阅内容:
public RssActionResult RSS() {
StoryLink[] stories = GetAllStories();
return new RssActionResult<StoryLink>("My Stories", stories, e => {
return new XElement("item",
new XAttribute("title", e.Title),
new XAttribute("description", e.Description),
new XAttribute("link", e.Url));
});
}
触发这个Action就会浏览器机会显示:

ASP.NET MVC Controllers and Actions的更多相关文章
- Post Complex JavaScript Objects to ASP.NET MVC Controllers
http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/ Post ...
- 第十五章 提升用户体验 之 设计实现MVC controllers 和 actions
1. 概述 controllers 和 actions 是 ASP.NET MVC4中非常重要的组成部分. controller管理用户和程序间的交互,使用action作为完成任务的方式. 如果是包含 ...
- [引]ASP.NET MVC 4 Content Map
本文转自:http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx The Model-View-Controller (MVC) ...
- ASP.NET MVC HttpVerbs.Delete/Put Routes not firing
原文地址: https://weblog.west-wind.com/posts/2015/Apr/09/ASPNET-MVC-HttpVerbsDeletePut-Routes-not-firing ...
- 【转】Controllers and Routers in ASP.NET MVC 3
Controllers and Routers in ASP.NET MVC 3 ambilykk, 3 May 2011 CPOL 4.79 (23 votes) Rate: vote 1vote ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
- 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...
- ASP.NET MVC 多语言实现——URL路由
考虑实现一个完整的基于asp.net mvc的多语言解决方案,从路由到model再到view最后到数据库设计(先挖好坑,后面看能填多少). 我所见过的多语言做得最好的网站莫过于微软的msdn了,就先从 ...
- 使用ASP.NET MVC操作过滤器记录日志(转)
使用ASP.NET MVC操作过滤器记录日志 原文地址:http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_Filte ...
随机推荐
- Android SQLite调试
调试SQLite的神器,再也不用自己去打Log了,只需简单的几个命令. adb shell setprop log.tag.SQLiteLog V adb shell setprop log.tag. ...
- Html5 Json应用
本文主要说明Json的基本概念,和一个在Html中使用Json给元素赋值的小例子,属于基础性信息 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Obj ...
- EMC与地之重新认识地
记得在Mark的培训中,他手上拿了一个无线鼠标,然后问了一个很有意思的问题:“这个无线鼠标的地在哪里?同样,我们的手机没有和任何大地有接 触,那么这个地又在哪里呢?”这个问题确实很有意思,也确实让人很 ...
- 复习sql server
1.数据库的概念模型独立于具体的机器和dbms 概念模型侧重于表达建模对象之间联系的语义,它是一种独立于计算机系统的模型,是现实世界的第一层次抽象,是用户和数据库设计人员进行交流的工具 2.数据库的数 ...
- JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)
1.事件冒泡与事件捕获 2.事件与事件句柄 3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处: 1.每个函 ...
- word-break: break-all;、word-break: keep-all; 、word-wrap: break-word;和white-space:nowrap;都有什么作用
小颖最近心情不好,心情不好就容易做傻事,所以昨天就干了件傻事 小颖昨天脑子一抽去拔罐了,拔完我就~~~~~~~~~~~~疼死宝宝了,昨晚一晚都没睡好,都不敢平躺,难受一晚上,早上到公司后困得啊,也是傻 ...
- 计算机程序的思维逻辑 (39) - 剖析LinkedList
上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们 ...
- Linux基礎知識 —— open&close
下面說一下在用戶空間調用open/close/dup跟驅動中的open和release的對應. 下面是測試驅動: #include <linux/module.h> #include &l ...
- OCP考点实战演练01-备份恢复篇
本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练01-备份恢复篇 1.数据库开启归档 2. ...
- 原创:MD5 32位加密软件
网站后台数据库切勿使用明文保存密码,否则一旦黑客拿下你的Webshell,后果不堪设想. 网站后台密码加密大多数采用的就是MD5算法加密.今天给大家送一个本人用c#简单编写的MD5 32位加密程序,虽 ...