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物件。