Jaka jest różnica między ViewResult()
i ActionResult()
w ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Jaka jest różnica między ViewResult()
i ActionResult()
w ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Odpowiedzi:
ActionResult to klasa abstrakcyjna, która może mieć kilka podtypów.
ViewResult - renderuje określony widok do strumienia odpowiedzi
PartialViewResult - renderuje określony widok częściowy do strumienia odpowiedzi
EmptyResult - zwracana jest pusta odpowiedź
RedirectResult - Wykonuje przekierowanie HTTP na określony adres URL
RedirectToRouteResult - Wykonuje przekierowanie HTTP na adres URL określony przez silnik routingu na podstawie danych trasy
JsonResult - Serializuje dany obiekt ViewData do formatu JSON
JavaScriptResult - zwraca fragment kodu JavaScript, który można wykonać na kliencie
ContentResult - zapisuje zawartość do strumienia odpowiedzi bez konieczności wyświetlania
FileContentResult - Zwraca plik do klienta
FileStreamResult - Zwraca plik do klienta, który jest dostarczany przez strumień
FilePathResult - Zwraca plik do klienta
ActionResult to klasa abstrakcyjna.
ViewResult wywodzi się z ActionResult . Inne pochodne klasy to JsonResult i PartialViewResult .
Deklarujesz to w ten sposób, abyś mógł skorzystać z polimorfizmu i zwrócić różne typy tą samą metodą.
na przykład:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Z tego samego powodu nie piszesz każdej metody każdej klasy, aby zwrócić „obiekt”. Powinieneś być jak najbardziej konkretny. Jest to szczególnie cenne, jeśli planujesz pisać testy jednostkowe. Nigdy więcej testowych typów zwrotów i / lub rzutowania wyniku.
ViewResult jest podklasą ActionResult. Metoda View zwraca ViewResult. Tak naprawdę te dwa fragmenty kodu robią dokładnie to samo. Jedyna różnica polega na tym, że w przypadku ActionResult kontroler nie obiecuje zwrócić widoku - możesz zmienić treść metody, aby warunkowo zwrócić RedirectResult lub coś innego bez zmiany definicji metody.
Podczas gdy inne odpowiedzi poprawnie zauważyły różnice, zauważ, że jeśli faktycznie zwracasz ViewResult, lepiej jest zwrócić bardziej konkretny typ niż podstawowy typ ActionResult. Oczywistym wyjątkiem od tej zasady jest sytuacja, gdy metoda zwraca wiele typów pochodzących z ActionResult.
Aby uzyskać pełne omówienie przyczyn tej zasady, zobacz pokrewną dyskusję tutaj: Czy metody kontrolera ASP.NET MVC muszą zwracać ActionResult?
W kontrolerze można użyć poniższej składni
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
W powyższym przykładzie zmienia się tylko typ zwrotu. jeden wraca, ViewResult
a drugi wraca ActionResult
.
ActionResult to klasa abstrakcyjna. Może zaakceptować:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult itp.
ViewResult
Jest podklasą ActionResult
.
W sterowniku określiłem poniższy kod za pomocą ActionResult, która jest klasą podstawową, która może mieć 11 podtypów w MVC, takich jak: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePath.
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
}
Podobnie możemy zwrócić wszystkie te 11 podtypów za pomocą ActionResult () bez wyraźnego określenia każdej metody podtypu. ActionResult jest najlepszą rzeczą, jeśli zwracasz różne typy widoków.
Aby zaoszczędzić trochę czasu, tutaj jest odpowiedź z linku z poprzedniej odpowiedzi na https://forums.asp.net/t/1448398.aspx
ActionResult jest klasą abstrakcyjną i jest klasą podstawową dla klasy ViewResult.
W środowisku MVC używa klasy ActionResult, aby odwoływać się do obiektu zwracanego przez metodę akcji. I wywołuje na nim metodę ExecuteResult.
A ViewResult to implementacja dla tej abstrakcyjnej klasy. Spróbuje znaleźć stronę widoku (zwykle stronę aspx) w niektórych predefiniowanych ścieżkach (/ views / nazwa_kontrolera /, / views / shared / itp.) Według podanej nazwy widoku.
Zazwyczaj dobrą praktyką jest zwracanie przez metodę bardziej konkretnej klasy. Więc jeśli masz pewność, że twoja metoda akcji zwróci stronę przeglądania, możesz użyć ViewResult. Ale jeśli twoja metoda akcji może mieć inne zachowanie, na przykład renderowanie widoku lub przekierowanie. Możesz użyć bardziej ogólnej klasy bazowej ActionResult jako typu zwracanego.