Jaka jest różnica między ViewResult()
i ActionResult()
w ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
asp.net
asp.net-mvc
Domnic
źródło
źródło
Odpowiedzi:
ActionResult to klasa abstrakcyjna, która może mieć kilka podtypów.
Podtypy ActionResult
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
Zasoby
źródło
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:
źródło
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.
źródło
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.
źródło
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?
źródło
W kontrolerze można użyć poniższej składni
W powyższym przykładzie zmienia się tylko typ zwrotu. jeden wraca,
ViewResult
a drugi wracaActionResult
.ActionResult to klasa abstrakcyjna. Może zaakceptować:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult itp.
ViewResult
Jest podklasąActionResult
.źródło
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.
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.
źródło
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.
źródło