MVC ActionResult -- JavaScriptResult,JsonResult
以下是ActionResult的继承图:
大概的分类:
- EmptyResult:表示不执行任何操作的结果
- ContentResult :返回文本结果
- JavaScriptResult:返回结果为JavaScript
- JsonResult :返回Json结构数据
- RedirectResult,RedirectToRouteResult
- FileContentResult,FilePathResult,FileStreamResult
- ViewResult,PartialViewResult
- HttpNotFoundResult,HttpUnauthorizedResult
JavaScriptResult
查了很多的资料都没有发现JavaScriptResult的实际用法,而且还发现了很多不建议使用JavaScriptResult的文章,因为这样脚本和后台不分离。
很多文章是按一下方式来使用JavaScriptResult的:
Action
public ActionResult GetTime() { var script = string.Format("$('#myPnl').html('{0}');", DateTime.Now); return JavaScript(script); }
View
@Html.ActionLink("Click Me", "GetTime")
这样的执行结果是页面并不会执行这一段script,而是将这段script作为文件Response出来。
既然执行GetTime这个Action其实取得script这段脚本的文件,那么就可以这样来使用:
<script src="@Url.Action("GetTime")" type="text/javascript"></script>
这样的结果就是该script段可以调用GetTime Action返回的代码段。
遗留的问题:
在MVC3中,如果引用了jquery.unobtrusive-ajax,那么使用@Html.ActionLink的时候页面会报JavaScript脚本错误,原因未知。
JsonResult
大家都知道AJax是使用Json来传输数据的,Json数据在JavaScript中被广泛使用,所以JsonResult的使用范围是非常管的,下面代码演示了在MVC的Ajax.ActionLink中如何使用JsonResult
Action
[HttpPost] public ActionResult GetDetail() { return Json(new { UserName = "Test User Name", Email = "Test@Test.com", Desc = "Test Desc" }); }
View
<script type="text/javascript"> function handleSuccess(context) { $("#userName").html(context.UserName); $("#email").html(context.Email); $("#desc").html(context.Desc); } </script> <table> <tr> <td> UserName </td> <td> <div id="userName" /> </td> </tr> <tr> <td> Email </td> <td> <div id="email" /> </td> </tr> <tr> <td> Desc </td> <td> <div id="desc" /> </td> </tr> </table> @Ajax.ActionLink("Click Me", "GetDetail", new AjaxOptions { HttpMethod = "POST", OnSuccess = "handleSuccess" })
在点击ActionLink后,会调用GetDetailAction返回JsonResult,在OnSuccess方法中可以对返回的结果进行处理。
当然要使用以上功能需要引用以下文件:
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
以上使用方法是在MVC3上测试通过的,但是在参考MVC2的代码时,发现用法上有以下差异:
在MVC2中是不支持jquery.unobtrusive-ajax.min.js的,返回的context也需要做以下处理,
<script type="text/javascript"> function handleSuccess(context) { var json = context.get_data(); var data = Sys.Serialization.JavaScriptSerializer.deserialize(json); $("#userName").html(data.UserName); $("#email").html(data.Email); $("#desc").html(data.Desc); } </script>