Asp.net MVC中Controller返回值类型
在mvc中所有的controller类都必须使用"Controller"后缀来命名
并且对Action也有一定的要求:
ASP.NET MVC包括了执行常见任务的ActionResult类型,动作结果的类型及其说明
动作结果的类型 |
说 明 |
EmptyResult |
代表一个空值或空的响应。不进行任何操作 |
ContentResult |
将指定的内容作为文本直接写入响应中 |
JsonResult |
串行化提供到JSON中的对象并将 JSON写入响应中 |
RedirectResult |
将用户重新定向到给定的URL中 |
RedirectToRouteResult |
将用户重新定向到通过路由选 择参数指定的URL中 |
ViewResult |
调用进视图引擎以将视图呈现到响应中 |
PartialViewResult |
与ViewResult相似,除了没有将局部 视图呈现给响应之外,通常会响应AJAX请求 |
FileResult |
用作一组结果的基类,这组结果将二 进制的响应编写到流中。这对于将文 件返回给用户非常有用 |
FilePathResult |
继承自FileResult并返回,将文件写入 基于文件路径的响应中 |
FileContentResult |
继承自FileResult并返回,将一个字 节数组写入响应中 |
FileStreamResult |
继承自FileResult并返回,将一个 流写入响应中 |
JavaScriptResult |
用于在客户机上立刻执行来自服务 器的JavaScript代码 |
如:
// 必须返回ActionResult类型
public ActionResult HelloWorld()
{
ViewData["Message"] = "Hello World!";
return View();
}
下面列举Asp.net MVC中Controller中的ActionResult返回类型
1、返回ViewResult视图结果,将视图呈现给网页
public ActionResult About()
{
return View(); // 参数可以返回model对象
}
2、 返回PartialViewResult部分视图结果,主要用于返回部分视图内容
在View/Shared目录下创建ViewUserControl.cshtml部分视图
public ActionResult UserControl()
{
ViewBag.Message = "部分视图";
return PartialView("ViewUserControl");
}
页面调用@ViewBag.Message 将输出“部分视图”
3、 返回ContentResult用户定义的内容类型
public ActionResult Content()
{
return Content("Test Content", "text/html"); // 可以指定文本类型
}
页面输出“Test Content”;
此类型多用于在ajax操作中需要返回的文本内容
// GET: Ajax
public ActionResult Index()
{
//return View();
return Content("");
}
5、返回JavaScriptResult可在客户端执行的脚本
public ActionResult JavaScript()
{
string str = string.Format("alter('{0}');", "弹出窗口");
return JavaScript(str);
}
但这里并不会直接响应弹出窗口,需要用页面进行再一次调用。
这个可以方便根据不同逻辑执行不同的js操作
6、返回FileResult要写入响应中的二进制输出,一般可以用作要简单下载的功能
public ActionResult File()
{
string fileName = "~/Content/test.zip"; // 文件名
string downFileName = "文件显示名称.zip"; // 要在下载框显示的文件名
return File(fileName, "application/octet-stream", downFileName);
}
直接下载test.zip后保存到本地则为"文件显示名称.zip"
7、 返回Null或者Void数据类型的EmptyResult
public ActionResult Empty()
{
return null;
}
返回NULL
8、重定向方法:Redirect / RedirectToAction / RedirectToRoute
Redirect:直接转到指定的url地址
public ActionResult Redirect()
{
// 直接返回指定的url地址
return Redirect("http://www.baidu.com");
}
RedirectToAction:直接使用 Action Name 进行跳转,也可以加上ControllerName
public ActionResult RedirectResult()
{
return RedirectToAction("Index", "Home", new { id = "100", name = "liu" });
}
也可以带上参数
RedirectToRoute:指定路由进行跳转
public ActionResult RedirectRouteResult()
{
return RedirectToRoute("Default", new { controller = "Home", action = "Index" });
}
Default为global.asax.cs中定义的路由名称
ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用户输入值和传递的参数信息,比如:查询参数的值,提交的表单的值或者通过路由系统从URL中获取的值等等。在ASP.NET MVC中有三种方式来获取访问这些值:
1、从Controller的上下文获取
2、从Action参数中获取
3、利用ASP.NET MVC的model 绑定特性
下面我就分别对上面三种方式进行介绍。
一旦创建的Controller是从基类Controller中继承的就可以通过Controller的上下文获取参数信息,基类Controller我们提供了很多属性: Request, Response , RouteData, HttpContext, and Server,每一个属性都是Controller的上下文对象,它们各针对不同方面信息。利用这些对象可以获取到当前请求的相关变量的值。
比如下面的一个Action方法:
public ActionResult RenameProduct()
{
// 通过上下文对象获取变量的值
string userName = User.Identity.Name;
string serverName = Server.MachineName;
string clientIP = Request.UserHostAddress;
DateTime dateStamp = HttpContext.Timestamp;
AuditRequest(userName, serverName, clientIP, dateStamp, "Renaming product");
// 通过上下文的请求对象获取表单提交的参数值
string oldProductName = Request.Form["OldName"];
string newProductName = Request.Form["NewName"];
bool result = AttemptProductRename(oldProductName, newProductName);
ViewData["RenameResult"] = result;
return View("ProductRenamed");
}
在Controller的Action方法可以带有参数,ASP.NET MVC框架会自动从请求的上下文中提取这些参数的值分别对应到Action的参数。这也是可读性最好和最简介的方式。
假设之前我们是通过请求下文对象来获取参数的值:
public ActionResult ShowWeatherForecast()
{
string city = (string)RouteData.Values["city"];
DateTime forDate = DateTime.Parse(Request.Form["forDate"]);
// ... implement weather forecast here ...
return View();
}
接下来我们可能通过Action参数对上面进行改进:
public ActionResult ShowWeatherForecast(string city, DateTime forDate)
{
// ... implement weather forecast here ...
return View();
}
可以看出采用通过Action参数的方式大大的减少了代码量和提高了可读性。使用参数的形式还有一个好处是利于单元测试,因为我们不用创建一个RouteData和Request对象,直接传递对应参数就可以测试。MVC框架通过检查请求上下文对象为这些参数提供值,其中包括以下集合:
Request.QueryString,
Request.Form ,
RouteData.Values
注意:Action参数是不区分大小写的,比如:Action有一个参数为city,我们可以通过Request.Form["City"]获取到值。
基类Controller设置Action参数的值是通过MVC框架中的value providers和model binders两个组件完成的。MVC框架内置的value providers通过从集合, Request.Form, Request.QueryString, Request.Files, 和RouteData.Values获取值,然后传递给model binders分别映射到我们的Action相应的参数中去。默认的model binders就可以映射任何的.NET类型的参数,包括基本类型、集合类型和自定义的类。你可以看看我之前写的:ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例,以后我会详细的介绍ASP.NET MVC的model绑定特性。