ความแตกต่างระหว่างViewResult()
และActionResult()
ใน ASP.NET MVC คืออะไร?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
ความแตกต่างระหว่างViewResult()
และActionResult()
ใน ASP.NET MVC คืออะไร?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
คำตอบ:
ActionResult เป็นคลาสนามธรรมที่สามารถมีหลายชนิดย่อย
ViewResult - แสดงมุมมองที่ระบุไปยังสตรีมการตอบกลับ
PartialViewResult - แสดงมุมมองบางส่วนที่ระบุไปยังสตรีมการตอบกลับ
EmptyResult - การตอบสนองที่ว่างเปล่าจะถูกส่งกลับ
RedirectResult - ดำเนินการเปลี่ยนเส้นทาง HTTP ไปยัง URL ที่ระบุ
RedirectToRouteResult - ดำเนินการเปลี่ยนเส้นทาง HTTP ไปยัง URL ที่กำหนดโดยเอ็นจิ้นการจัดเส้นทางตามข้อมูลเส้นทางที่กำหนด
JsonResult - ทำให้เป็นอนุกรมวัตถุ ViewData ที่กำหนดให้เป็นรูปแบบ JSON
JavaScriptResult - ส่งคืนโค้ด JavaScript ที่สามารถเรียกใช้งานบนไคลเอนต์ได้
ContentResult - เขียนเนื้อหาลงในสตรีมการตอบกลับโดยไม่ต้องมีมุมมอง
FileContentResult - ส่งคืนไฟล์ไปยังไคลเอ็นต์
FileStreamResult - ส่งคืนไฟล์ไปยังไคลเอ็นต์ซึ่งจัดทำโดยสตรีม
FilePathResult - ส่งคืนไฟล์ไปยังไคลเอ็นต์
ActionResultเป็นคลาสนามธรรม
ViewResultมาจากActionResult ชั้นเรียนมาอื่น ๆ ได้แก่JsonResultและPartialViewResult
คุณประกาศด้วยวิธีนี้เพื่อให้คุณสามารถใช้ประโยชน์จาก polymorphism และคืนค่าชนิดต่าง ๆ ในวิธีเดียวกัน
เช่น:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
ด้วยเหตุผลเดียวกับที่คุณไม่ได้เขียนวิธีการทุก ๆ คลาสเพื่อส่งคืน "วัตถุ" คุณควรเจาะจงให้มากที่สุดเท่าที่จะทำได้ สิ่งนี้มีค่ามากหากคุณวางแผนที่จะเขียนการทดสอบหน่วย ไม่มีประเภทการทดสอบส่งคืนและ / หรือการคัดเลือกผลลัพธ์
ViewResult เป็นคลาสย่อยของ ActionResult กระบวนการดูวิธีการส่งกลับ ViewResult ดังนั้นตัวอย่างโค้ดสองอันนี้ก็ทำแบบเดียวกัน ความแตกต่างเพียงอย่างเดียวคือด้วย ActionResult หนึ่งคอนโทรลเลอร์ของคุณไม่ได้สัญญาว่าจะส่งคืนมุมมอง - คุณสามารถเปลี่ยนเนื้อหาของเมธอดเพื่อส่งคืน RedirectResult หรืออย่างอื่นโดยไม่มีเงื่อนไขโดยไม่ต้องเปลี่ยนนิยามของเมธอด
ในขณะที่คำตอบอื่น ๆ ได้บันทึกความแตกต่างอย่างถูกต้องโปรดทราบว่าหากคุณกลับมาเป็น ViewResult เท่านั้นจะเป็นการดีกว่าที่จะคืนค่าชนิดที่เฉพาะเจาะจงมากกว่าประเภท ActionResult พื้นฐาน ข้อยกเว้นที่ชัดเจนสำหรับหลักการนี้คือเมื่อเมธอดของคุณส่งคืนหลายชนิดที่ได้รับจาก ActionResult
สำหรับการอภิปรายอย่างเต็มรูปแบบของเหตุผลที่อยู่เบื้องหลังหลักการนี้โปรดดูการอภิปรายที่เกี่ยวข้องที่นี่: วิธีการ ASP.NET MVC Controller ต้องส่งคืน ActionResult
ในตัวควบคุมหนึ่งสามารถใช้ไวยากรณ์ด้านล่าง
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
ในตัวอย่างด้านบนเฉพาะประเภทการคืนเท่านั้นที่จะแตกต่างกันไป หนึ่งส่งคืนViewResult
ในขณะที่อีกหนึ่งส่งกลับActionResult
ในขณะที่อีกหนึ่งผลตอบแทน
ActionResult เป็นคลาสนามธรรม สามารถยอมรับได้:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult เป็นต้น
ViewResult
เป็น subclass ActionResult
ของ
ใน Controller ฉันได้ระบุรหัสด้านล่างด้วย ActionResult ซึ่งเป็นคลาสพื้นฐานที่สามารถมี 11 ชนิดย่อยใน MVC เช่น: ViewResult, FileialResult ,ResultResultResult, RedResToRouteR, JsonResult, JavaScriptResult, FileContentResult
public ActionResult Index()
{
if (HttpContext.Session["LoggedInUser"] == null)
{
return RedirectToAction("Login", "Home");
}
else
{
return View(); // returns ViewResult
}
}
//More Examples
[HttpPost]
public ActionResult Index(string Name)
{
ViewBag.Message = "Hello";
return Redirect("Account/Login"); //returns RedirectResult
}
[HttpPost]
public ActionResult Index(string Name)
{
return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
}
ในทำนองเดียวกันเราสามารถกลับ 11 ชนิดย่อยทั้งหมดเหล่านี้โดยใช้ ActionResult () โดยไม่ต้องระบุทุกวิธีการย่อยอย่างชัดเจน ActionResult เป็นสิ่งที่ดีที่สุดถ้าคุณกลับมาใช้มุมมองประเภทอื่น
เพื่อช่วยคุณประหยัดเวลานี่คือคำตอบจากลิงก์ในคำตอบก่อนหน้านี้ที่https://forums.asp.net/t/1448398.aspx
ActionResult เป็นคลาสนามธรรมและเป็นคลาสพื้นฐานสำหรับคลาส ViewResult
ในกรอบ MVC จะใช้คลาส ActionResult เพื่ออ้างอิงวัตถุที่วิธีการดำเนินการของคุณส่งคืน และเรียกใช้วิธี ExecuteResult
และ ViewResult เป็นการใช้งานสำหรับคลาสนามธรรมนี้ มันจะพยายามค้นหาหน้ามุมมอง (โดยปกติจะเป็นหน้า aspx) ในบางเส้นทางที่กำหนดไว้ล่วงหน้า (/ views / controllername /, / views / shared /, ฯลฯ ) โดยใช้ชื่อมุมมองที่กำหนด
เป็นวิธีปฏิบัติที่ดีที่จะให้วิธีการของคุณคืนชั้นเรียนที่เฉพาะเจาะจงมากขึ้น ดังนั้นหากคุณแน่ใจว่าวิธีการกระทำของคุณจะกลับมาบางหน้าดูคุณสามารถใช้ ViewResult แต่ถ้าวิธีการกระทำของคุณอาจมีพฤติกรรมที่แตกต่างกันเช่นแสดงภาพหรือเปลี่ยนเส้นทาง คุณสามารถใช้คลาสพื้นฐานเพิ่มเติม ActionResult เป็นชนิดส่งคืนได้