Clear        


                
                    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
            });
        }
    }
}