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
1 public ActionResult GetTime() 2 { 3 var script = string.Format("$('#myPnl').html('{0}');", DateTime.Now); 4 return JavaScript(script); 5 }
View
1 @Html.ActionLink("Click Me", "GetTime")
这样的执行结果是页面并不会执行这一段script,而是将这段script作为文件Response出来。
既然执行GetTime这个Action其实取得script这段脚本的文件,那么就可以这样来使用:
1 <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
1 [HttpPost] 2 public ActionResult GetDetail() 3 { 4 return Json(new 5 { 6 UserName = "Test User Name", 7 Email = "Test@Test.com", 8 Desc = "Test Desc" 9 }); 10 }
View
1 <script type="text/javascript"> 2 function handleSuccess(context) { 3 $("#userName").html(context.UserName); 4 $("#email").html(context.Email); 5 $("#desc").html(context.Desc); 6 } 7 </script> 8 <table> 9 <tr> 10 <td> 11 UserName 12 </td> 13 <td> 14 <div id="userName" /> 15 </td> 16 </tr> 17 <tr> 18 <td> 19 Email 20 </td> 21 <td> 22 <div id="email" /> 23 </td> 24 </tr> 25 <tr> 26 <td> 27 Desc 28 </td> 29 <td> 30 <div id="desc" /> 31 </td> 32 </tr> 33 </table> 34 @Ajax.ActionLink("Click Me", "GetDetail", new AjaxOptions { HttpMethod = "POST", OnSuccess = "handleSuccess" })
在点击ActionLink后,会调用GetDetailAction返回JsonResult,在OnSuccess方法中可以对返回的结果进行处理。
当然要使用以上功能需要引用以下文件:
1 <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> 2 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 3 <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script> 4 <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
以上使用方法是在MVC3上测试通过的,但是在参考MVC2的代码时,发现用法上有以下差异:
在MVC2中是不支持jquery.unobtrusive-ajax.min.js的,返回的context也需要做以下处理,
1 <script type="text/javascript"> 2 function handleSuccess(context) { 3 var json = context.get_data(); 4 var data = Sys.Serialization.JavaScriptSerializer.deserialize(json); 5 $("#userName").html(data.UserName); 6 $("#email").html(data.Email); 7 $("#desc").html(data.Desc); 8 } 9 </script>