1. 程式人生 > >Asp.Net MVC控制器中Action的返回值型別

Asp.Net MVC控制器中Action的返回值型別

控制器中Action的返回值型別有很多,最常見的是ActionResult,通過檢視原始碼可以發現ActionResult是一個抽象類,它有很多的子類。如果Action的返回值型別為ActionResult,那麼可以返回任意子類物件;如果Action的返回值型別為某一具體的子型別,例如:ContentResult,那麼就只可以返回ContentResult型別物件。接下來說幾個平時比較常用的返回值型別:ViewResult、ContentResult、JsonResult和RedirectToRouteResult。

ViewResult

返回值為ViewResult即返回展示給使用者的前臺頁面(檢視),return View()可以返回本控制器內的任意檢視。當return View()返回與Action不同名的檢視時會直接展示檢視,而不是執行對應的Action方法。

public ViewResult Index()
{
    UserInfoModel userInfoModel = new UserInfoModel();
    userInfoModel.AddTime = DateTime.Now;
    userInfoModel.UserName = "使用者名稱";
    int number = 123;
    //【過載1】預設返回與Action同名的檢視
    return View();
    //【過載2】返回本控制器下的Add檢視
    return View("Add");
    //【過載3】一般傳遞的引數物件的型別與檢視的模型類一致
return View("Add", userInfoModel); }

ContentResult

ContentResult用於將字串直接向客戶端輸出。
後臺程式碼:

public ContentResult GetUserInfo()
{
    string userInfo = "[{\"UserName\":\"蟈蟈\",\"Age\":\"18\",\"PhoneNumber\":\"18233199999\"}," +
                      "{\"UserName\":\"果果\",\"Age\":\"16\",\"PhoneNumber\"
:\"18233199999\"}," + "{\"UserName\":\"郭郭\",\"Age\":\"20\",\"PhoneNumber\":\"18233199999\"}]"; return Content(userInfo); }

前臺程式碼:

function TestActionResult_Index_AddUserInfo1(userInfo) {
    //先把字串轉換為Json物件
    var userInfoArray = JSON.parse(userInfo);
    for (var i = 0; i < userInfoArray.length; i++) {
        $("<tr></tr>").append("<td>" + userInfoArray[i].UserName + "</td>")
                      .append("<td>" + userInfoArray[i].Age + "</td>")
                      .append("<td>" + userInfoArray[i].PhoneNumber + "</td>")
                      .appendTo($("#TestActionResult_Index_tb"));
    }
}

JsonResult

JsonResult首先將指定的物件序列化為Json字串,然後將字串寫入到HTTP輸出流。由於Json字串在MVC前後臺互動過程中使用頻率很高,所以多舉幾個例子。
1)返回Json陣列

public JsonResult GetUserInfoJsonArray()
{
    List<object> userInfoList = new List<object>();
    //userInfoList新增匿名物件
    userInfoList.Add(new
    {
        UserName="蟈蟈",Age=18,PhoneNumber="18233199999"
    });
    userInfoList.Add(new
    {
        UserName="果果",Age=16,PhoneNumber="18233199999"
    });
    userInfoList.Add(new
    {
        UserName="郭郭",Age=20,PhoneNumber="18233199999"
    });
    //如果請求方式為get,則必須設定JsonRequestBehavior.AllowGet
    return Json(userInfoList, JsonRequestBehavior.AllowGet);
}

2)返回Json物件

public JsonResult GetUserInfoJsonObject()
{
    List<object> userInfoList = new List<object>();
    userInfoList.Add(new
    {
        UserName = "蟈蟈",Age = 18,PhoneNumber = "18233199999"
    });
    userInfoList.Add(new
    {
        UserName = "果果",Age = 16,PhoneNumber = "18233199999"
    });
    userInfoList.Add(new
    {
        UserName = "郭郭",Age = 20,PhoneNumber = "18233199999"
    });
    //【方法1】返回匿名物件或例項物件
    var resultList = new
    {
        Company = "熱血傳奇",
        President = "蟈蟈",
        UserInfoList = userInfoList
    };
    return Json(resultList, JsonRequestBehavior.AllowGet);
    //【方法2】返回Dictionary物件
    Dictionary<string, object> dict = new Dictionary<string, object>()
    {
        {"Company","熱血傳奇"},
        {"President","蟈蟈"},
        {"UserInfoList",userInfoList}
    };
    return Json(dict, JsonRequestBehavior.AllowGet);
}

RedirectToRouteResult

RedirectToRouteResult可以跳轉到本專案內任意控制器的Action,當重定向路由時會根據引數執行對應的控制器下的Action方法,而不是直接展示頁面。

public ViewResult Index()
{
    UserInfoModel userInfoModel = new UserInfoModel();
    userInfoModel.AddTime = DateTime.Now;
    userInfoModel.UserName = "使用者名稱";
    int number = 123;            
    //【過載1】訪問Home控制器下的Add方法        
    return RedirectToAction("Add", "Home");
    //【過載2】訪問Home控制器下的Add方法,並且引數id=6
    return RedirectToAction("Add", "Home", new {id = 6});
}

ContentResult與JsonResult返回Json資料的區別

1.當返回到前端的json資料,不標準時如–”{\”Age\”:\”abcde\”,\”name\”:\”rer\”}”,前端抓包的值和我給的一樣。不管你的返回值型別是
JsonResult還是String,都需要使用JSON.parse(Data)手動轉換一下,才能把字串變為JSON物件。
2.當返回到前端的json資料,標準時如–”{“Age”:”abcde”,”name”:”rer”}”,前端抓包的值和我給的一樣。
只需要保證響應報文頭的ContentType = “application/json,JQ 都會自動把JSON字串轉換為JSON物件。