MVC ActionResult -- JavaScriptResult,JsonResult

正式解释之前,先来看看ActionResult的继承图:

大概的分类:

  1. EmptyResult:表示不执行任何操作的结果
  2. ContentResult :返回文本结果
  3. JavaScriptResult:返回结果为JavaScript
  4. JsonResult :返回Json结构数据
  5. RedirectResult,RedirectToRouteResult
  6. FileContentResult,FilePathResult,FileStreamResult
  7. ViewResult,PartialViewResult
  8. 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>

 

posted @ 2017-07-03 11:04  FelixWang  阅读(483)  评论(0编辑  收藏  举报