using Microsoft.AspNetCore.Mvc;
using MVC.Models;
using System.Diagnostics;
namespace MVC.Controllers
{
public class HomeController : Controller
{
// Declares an optional logger for this controller and assigns
// it via dependency injection in the constructor.
// Provides logging information, warnings, errors, and other
// diagnostic messages within this controller.
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
// This action can be executed in the browser's address bar
// to return the Index view as entering the URLs
// "https://localhost:port/Home/Index" or
// "http://localhost:port/Home/Index".
// The route of the action is /Home/Index according to the default
// MVC routing pattern defined in Program.cs file as
// "{controller=Home}/{action=Index}/{id?}".
// The default action is defined as Index therefore the Index action
// of a controller will be executed when action name is not provided
// such as the route: "/Home" ("https://localhost:port/Home").
// The default controller is Home therefore the Index action of the
// Home controller will be executed when both action and controller
// names are not provided such as the route:
// "/" ("https://localhost:port").
// ? means id value is optional. So if provided as the action's
// parameter as Index(int id), the route will be: "/Home/Index/7"
// ("https://localhost:port/Home/Index/7") where id parameter value
// will be 7.
public IActionResult Index() // Index action without returning a model
// to the Index view.
{
return View(); // Right-click and then Go to View to see the
// Index.cshtml view under Views/Home folder.
// The returned view (Views/Home/Index.cshtml) is first searched
// under Views/Home folder, then Views/Shared folder, and the
// view is returned if found.
// Views in the Shared folder can be returned from any controller's
// any action.
}
// Some action result examples:
/*
ActionResult inheritance:
IActionResult : general return type of actions in a controller
|
ActionResult: base class that implements IActionResult
|
ViewResult (returned by View method) -
ContentResult (returned by Content method) -
NotFoundResult (returned by NotFound method) -
RedirectResults -
HttpStatusCodeResults -
JsonResult -
etc.
*/
// The route of the action is /Home/View1.
// Way 1:
//public ViewResult View1()
// Way 2: Since ViewResult inherits ActionResult and ActionResult
// implements IActionResult, IActionResult can be used as return type.
public IActionResult View1() // Right-click the action name then click
// Add View to create an Empty view named
// View1.cshtml under Views/Home folder.
{
// Way 1:
//string model = "View1 view returned with this string Model " +
// "object from View1 action.";
// Way 2:
object model = "View1 view returned with this string Model " +
"object from View1 action."; // All classes in C# inherit from
// the Object class.
// Carrying extra data other than the Model to the view:
// Way 1:
//ViewData["Text"] = "Extra string text other than the Model " +
// "object is carried via ViewData dictionary from View1 action.";
// Way 2:
ViewBag.Text = "Extra string text other than the Model " +
"object is carried via ViewData dictionary from View1 action.";
// Objects can also be assigned.
return View(model); // Model object types can be string, int, etc.
// also generally complex types such as class.
}
// The route of the action is /Home/View2.
public IActionResult View2()
{
// Way 1:
//string model = "View1 view returned with this string Model " +
// "object from View2 action.";
// Way 2: var can be used instead of types if there is an assignment.
var model = "View1 view returned with this string Model " +
"object from View2 action.";
return View("View1", model);
}
// The route of the action is /Home/Content1.
public IActionResult Content1()
{
return Content("Plain string text content returned from " +
"Content1 action."); // Optionally text/plain and Encoding.UTF8
// parameters (for Turkish character problems)
// can be provided.
}
// The route of the action is /Home/Content2.
public IActionResult Content2()
{
return Content("<b>String HTML content returned from " +
"Content2 action.</b>", "text/html"); // Optionally Encoding.UTF8
// parameter (for Turkish
// character problems) can be
// provided.
}
// The route of the action is /Home/Redirect1.
public IActionResult Redirect1()
{
// If a view is returned from an action, extra data may be sent
// to the view via ViewData (ViewBag) dictionary.
// If a redirection to another action occurs in the action,
// data may be sent to the redirected action then the
// redirected action's view via TempData dictionary.
TempData["Message"] = "Message string is carried from Redirect1 action " +
"to the View1 action, therefore View1 action's returned view " +
"via TempData dictionary.";
// Way 1:
//return RedirectToAction("View1", "Home");
// Way 2:
//return RedirectToAction("View1");
// Way 3:
return RedirectToAction(nameof(View1)); // nameof returns the string
// representation of the View1
// method and can also be used for
// classes, class properties, etc.
}
// The route of the action is /Home/NotFound1.
public IActionResult NotFound1()
{
// Logs a warning message to the Kestrel Console or Visual Studio Output
// window. LogError, LogInformation, LogDebug, LogCritical and LogTrace
// methods can also be used. Logging is optional, therefore ILogger
// instance doesn't need to be injected in every controller.
_logger.LogWarning("Home controller NotFound1 action is executed.");
return NotFound("Message string returned from the NotFound1 action.");
// Returns HTTP 404 Not Found status code, parameter is optional.
}
// The route of the action is /Home/Privacy.
public IActionResult Privacy()
{
return View(); // Will return the Privacy.cshtml view under
// Views/Home folder.
}
// This action is used for displaying error information of the operations.
// ResponseCache is an attribute used for disabling response caching for this
// action so that every request gets a fresh result.
// Attributes gain new features to the methods, properties, classes, etc.
// they are applied to.
// The route of the action is /Home/Error.
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None,
NoStore = true)]
public IActionResult Error() // Will return the Error.cshtml view under
// Views/Shared folder sending the Model object
// as type ErrorViewModel class.
{
return View(new ErrorViewModel
{
// Set RequestId to the current activity's ID if available, otherwise
// uses the HTTP request's unique trace identifier.
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier
});
}
}
}