European ASP.NET MVC 4 and MVC 5 Hosting

BLOG about ASP.NET MVC 3, ASP.NET MVC 4, and ASP.NET MVC 5 Hosting and Its Technology - Dedicated to European Windows Hosting Customer

ASP.NET MVC Hosting - HostForLIFE.eu :: Learning About ASP.NET Core's MVC Application Life Cycle (.NET 6/7/8)

clock July 29, 2025 08:43 by author Peter

ASP.NET Core MVC: What Is It?
A lightweight, quick, and adaptable framework for creating web applications based on the Model-View-Controller paradigm is called ASP.NET Core MVC. It is open-source, cross-platform, and a component of the contemporary.NET ecosystem.

What makes it better than the old .NET Framework version?

  • Built-in Dependency Injection
  • Minimal startup code
  • Middleware pipeline instead of Global.asax
  • Easy configuration with Program.cs and appsettings.json

Basically, it gives us way more control and performance, while keeping things developer-friendly.

How a Request is Handled — Step by Step
Here’s what happens behind the scenes when someone hits your site.

1. Application Start – Program.cs
The old Startup.cs has merged into Program.cs (starting from .NET 6). This is where your app is bootstrapped.
var builder = WebApplication.CreateBuilder(args);

// Add services to the container
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"
);

app.Run();


Tip: I like to keep this clean by offloading complex service setups into extension methods.

2. Middleware Pipeline
Think of middleware as a chain of events that the request passes through. You can inspect, modify, or even short-circuit the request before it reaches the controller.

Typical ones include:

  • Error handling (UseExceptionHandler)
  • Authentication
  • Logging
  • Static files
  • Routing

app.UseRouting(); // enables routing

3. Routing to Controllers
This is where ASP.NET Core figures out which controller and action to call.

For example
URL: /products/details/5
→ controller = ProductsController
→ action = details
→ id = 5


The route pattern in MapControllerRoute makes this work.

4. Controller is Created
The framework uses Dependency Injection to create your controller. If you’ve registered services in Program.cs, they’ll be injected automatically.
public class ProductsController : Controller
{
    private readonly IProductService _service;
    public ProductsController(IProductService service)
    {
        _service = service;
    }

    public IActionResult Details(int id)
    {
        var product = _service.GetProduct(id);
        return View(product);
    }
}


Note. Constructor injection like this helps keep things testable and clean.

5. Action Method is Called
ASP.NET Core figures out the action method to call (like Details) and even binds parameters from the route, query string, or body.
public IActionResult Details(int id)

It just works — no extra parsing needed.

6. Result is Returned
Your action method can return different types of results:

  • ViewResult → renders a Razor view
  • JsonResult → returns JSON
  • RedirectToAction → redirects

return View(product); // returns HTML view

7. View is Rendered
If you return a view, the Razor View Engine kicks in and converts your .cshtml into HTML, which is sent back to the browser.
// Returns Views/Products/Details.cshtml
return View(product);

Done!

Visual Flow of MVC Request in ASP.NET Core
Browser Request
     ↓ 
Kestrel Web Server
     ↓ 
Middleware Pipeline (auth, routing, logging)
     ↓ 
Routing System
     ↓ 
Controller (via DI)
     ↓ 
Action Method
     ↓ 
ActionResult (View, JSON, etc.)
     ↓ 
View Engine (if ViewResult)
     ↓ 
HTML Response to Browser

Key Pieces You Should Know

Component What It Does
Program.cs App startup: configures services and request pipeline
Middleware Handles cross-cutting concerns (auth, logging, error handling)
Routing Maps URLs to controllers/actions
Controller Processes logic for a specific request
Action Method Executes business logic, returns a result
View Engine Renders .cshtml to HTML

Best Practices I Follow

  • Use [FromRoute], [FromBody], etc. for clarity in parameter binding.
  • Keep Program.cs neat — move big configs to separate methods or files.
  • Inject services into controllers (not directly calling DbContext or static classes).
  • Use filters (e.g., Authorize, ActionFilter) for cross-cutting concerns.
  • Return typed ActionResult<T> in APIs for better structure.

Wrapping Up
So that’s how the ASP.NET Core MVC application life cycle works in .NET 6, 7, and 8. Whether you’re building simple web pages or full-blown APIs, understanding how a request moves through your app gives you the power, to optimize, troubleshoot, and architect like a pro.

Hope this guide helps you as much as it’s helped me.



ASP.NET MVC Hosting - HostForLIFE.eu :: How to Consume Web API in ASP.NET MVC Using HttpClient?

clock July 25, 2025 07:51 by author Peter

Do you need to retrieve data from a Web API when developing an ASP.NET MVC application? You don't need to search any farther! Using actual examples and recommended practices, this article will teach you how to use the HttpClient class in ASP.NET MVC to consume a Web API.

What You'll Learn

  • What is HttpClient in .NET?
  • How to make GET requests to an API.
  • Deserialize JSON response into objects.
  • Display API data in an MVC view.
  • Full working code example.

Why Use HttpClient?
The HttpClient class is a part of the System.Net.Http namespace and provides powerful capabilities to send HTTP requests and receive HTTP responses.

It supports

  • GET, POST, PUT, DELETE methods.
  • Asynchronous operations.
  • Custom headers and authentication.

Prerequisites

  • Visual Studio (2019 or newer recommended)
  • ASP.NET MVC project
  • A working Web API endpoint
  • NuGet package: Newtonsoft.Json

Steps to Calling Web API in ASP.NET MVC
Step 1. Create a Model
public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
}

Step 2. Create Your Controller
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web.Mvc;
using Newtonsoft.Json;
using YourApp.Models;

public class HomeController : Controller
{
    string Baseurl = "https://yourapi.com/api/";

    public async Task<ActionResult> Index()
    {
        List<Employee> EmpInfo = new List<Employee>();

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(Baseurl);
            client.DefaultRequestHeaders.Clear();

            // Set header to accept JSON
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            // Call API
            HttpResponseMessage Res = await client.GetAsync("Employee/GetAllEmployees");

            // Check response
            if (Res.IsSuccessStatusCode)
            {
                var EmpResponse = Res.Content.ReadAsStringAsync().Result;

                EmpInfo = JsonConvert.DeserializeObject<List<Employee>>(EmpResponse);
            }
        }

        return View(EmpInfo);
    }
}


Step 3. Create the View (Index.cshtml)
@model IEnumerable<YourApp.Models.Employee>

<h2>Employee List</h2>

<table border="1">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Department</th>
    </tr>

    @foreach (var emp in Model)
    {
        <tr>
            <td>@emp.Id</td>
            <td>@emp.Name</td>
            <td>@emp.Department</td>
        </tr>
    }
</table>

Notes and Best Practices

  • Don't instantiate HttpClient inside a loop or frequently. Consider reusing it with dependency injection.
  • Always check for IsSuccessStatusCode before using the response.
  • For APIs that require authentication (Bearer tokens, etc.), you can add headers:

client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", token);

Install Newtonsoft.Json
Install-Package Newtonsoft.Json

Conclusion
This post taught you how to consume a Web API using the ASP.NET MVC HttpClient class. When front-end MVC has to retrieve data from external APIs or microservices, this method is frequently employed in enterprise apps.



ASP.NET MVC Hosting - HostForLIFE.eu :: Knowing ASP.NET MVC

clock July 15, 2025 10:27 by author Peter

ASP.NET MVC is a web application framework that helps developers create organized, scalable web applications. It is based on the Model-View-Controller (MVC) architectural pattern and is built on top of the Microsoft.NET platform.  Using C# and Razor syntax, it is frequently used to create dynamic webpages, dashboards, admin panels, and data-driven online applications.   In particular, it typically means:

  • ASP.NET MVC (for .NET Framework – Windows-only)
  • ASP.NET Core MVC (for .NET Core / .NET 5+ – cross-platform)

MVC, or Model–View–Controller, is a software design pattern that organizes an application into three interconnected components, each with a distinct responsibility:

  • Model: Manages the data and business logic. It’s like the brain of the application — storing, retrieving, and processing information.
  • View: Handles the presentation layer. Think of it as the face — what users see and interact with.
  • Controller: Acts as the coordinator. It receives user input, communicates with the model, and selects the appropriate view to display.

The Model-View-Controller (MVC) pattern is a core part of the .NET ecosystem. If you're learning about the .NET ecosystem, please read the full article at: Understanding the .NET Ecosystem. 

.NET MVC is a web development pattern and framework in .NET; it is not a language, but a structure used to build web apps efficiently.

ASP.NET Core MVC (part of .NET 8) is the current version of .NET MVC. It is used in all new development and supports modern features like Razor Pages, Minimal APIs, Blazor integration, dependency injection, and cloud/container readiness.

How does MVC work in a healthcare appointment portal?

Imagine a clinic where patients can

  • Register online
  • View available doctors
  • Book appointments
  • Track their visit history
  • Model: Represents entities like Patient, Doctor, Appointment, and Attendance. These classes hold data such as names, contact info, appointment times, and medical notes.
  • View: Displays forms for registration, appointment booking, and reports. It shows dynamic content like available slots and doctor profiles.
  • Controller: Handles user actions like submitting a booking form or requesting a report. It fetches data from the model and passes it to the view.

For example, when a patient books an appointment:

  • The Controller receives the request and validates it.
  • It uses the Model to store the appointment in the database.
  • Then it returns a View showing confirmation and upcoming appointments.

This setup allows doctors to manage their schedules, patients to interact with the system seamlessly, and admins to generate reports all within a clean, maintainable architecture.

Features of .NET MVC

  • Separation of Concerns: Keeps business logic (Model), UI (View), and input handling (Controller) separate, making code easier to manage and scale.
  • Testability: You can write unit tests for your business logic and controllers without involving the UI.
  • Clean URLs & SEO: Routing in MVC allows for readable, SEO-friendly URLs.
  • Full Control Over HTML: Unlike Web Forms, MVC gives you direct control over markup, which is great for responsive design and accessibility.
  • Extensibility: You can plug in custom filters, binders, and view engines to tailor the framework to your needs.
  • Parallel Development: Frontend and backend teams can work independently on Views and Controllers.

Conclusion
.NET MVC is a structured and efficient way to build dynamic, testable, and maintainable web applications using the Model-View-Controller (MVC) pattern in the .NET ecosystem. It separates application logic, data handling, and the user interface, making development more organized and scalable. In my learning, I’ve found that whether you're using ASP.NET MVC (legacy) or ASP.NET Core MVC (modern and recommended), understanding the MVC workflow is essential for building clean, scalable, and high-performance web applications.



ASP.NET MVC Hosting - HostForLIFE.eu :: Create a RESTful Student Information API using C#.NET and ASP.NET MVC

clock July 3, 2025 06:58 by author Peter

This article will demonstrate how to use ASP.NET MVC in C# to create a basic RESTful API. When a specific student ID is searched, this API will return student data (including name, date of birth, zip code, major department, and student ID). This beginner-friendly guide offers step-by-step instructions, code walkthroughs, and explanations to help you comprehend and complete the project.

Tools Required

  • Visual Studio 2019/2022 (Community Edition is free)
  • .NET Framework (4.7 or later)
  • Basic knowledge of C# syntax

Step 1. Create a New Web API Project

  • Open Visual Studio.
  • Click on File > New > Project.
  • Choose ASP.NET Web Application (.NET Framework).
  • Name your project StudentAPI and click OK.
  • Select the Web API template and click Create.

This sets up a basic project with preconfigured folders for Models, Controllers, and API routes.

Step 2. Create the Student Model
This model defines the structure of the student data.

File: Models/Student.cs
using System;

namespace StudentAPI.Models
{
    public class Student
    {
        public string StudentId { get; set; }     // Alphanumeric ID e.g. S1001
        public string Name { get; set; }          
        public DateTime DateOfBirth { get; set; } // e.g. 2001-06-15
        public string ZipCode { get; set; }       // e.g. 600001
        public string Major { get; set; }         // e.g. Computer Science
    }
}

Explanation

  • StudentId: Alphanumeric identifier for the student.
  • Name: Full name of the student.
  • DateOfBirth: The date of birth, stored as a DateTime object.
  • ZipCode: Postal code of the student’s residence.
  • Major: The department or field of study.

Step 3. Create the API Controller
The controller processes incoming HTTP requests and returns responses.

File: Controllers/StudentController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using StudentAPI.Models;

namespace StudentAPI.Controllers
{
public class StudentController : ApiController
{
    private static List<Student> students = new List<Student>
    {
        new Student
        {
            StudentId = "S1001",
            Name = "Carlos",
            DateOfBirth = new DateTime(2000, 3, 12),
            ZipCode = "600045",
            Major = "Mechanical Engineering"
        },
        new Student
        {
            StudentId = "S1002",
            Name = "Peter",
            DateOfBirth = new DateTime(2001, 7, 25),
            ZipCode = "641001",
            Major = "Electronics and Communication"
        },
        new Student
        {
            StudentId = "S1003",
            Name = "Scott",
            DateOfBirth = new DateTime(1999, 12, 30),
            ZipCode = "500081",
            Major = "Computer Science"
        }
    };

    // GET api/student/{id}
    public IHttpActionResult GetStudentById(string id)
    {
        var student = students.FirstOrDefault(
            s => s.StudentId.Equals(id, StringComparison.OrdinalIgnoreCase));

        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }
}
}

Explanation

  • We use an in-memory List<Student> to simulate a database.
  • The method GetStudentById accepts an ID as input.
  • It searches for the student in the list using LINQ.
  • If found, it returns the student data in JSON format.
  • If not found, it returns a 404 (Not Found) HTTP response.

Step 4. Configure Web API Routing
Ensure your app correctly maps incoming API requests.

File: App_Start/WebApiConfig.cs
using System.Web.Http;

namespace StudentAPI
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Enable attribute routing
        config.MapHttpAttributeRoutes();

        // Define default route
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
}


Explanation

  • Enables attribute routing.
  • Sets a default route pattern: api/{controller}/{id}.
  • This means a call to api/student/S1001 will map to StudentController.

Step 5. Run and Test Your API

  • Press F5 or click Start Debugging in Visual Studio.
  • The browser will open. Change the URL to:

http://localhost:1234/api/student/S1002

(Replace the port 1234 with your actual port number.)

Example Output
{
  "StudentId": "S1002",
  "Name": "peter",
  "DateOfBirth": "2000-08-25 T00:00:00",
  "ZipCode": "641001",
  "Major": "Electronics and Communication"
}

Happy Learning!



ASP.NET MVC Hosting - HostForLIFE.eu :: Bootstrap Modal PopUp Using ASP.NET MVC

clock June 20, 2025 08:20 by author Peter

We can show and hide the modal using the methods provided by Bootstrap Modal plugin.


Description
We are using modal ('show') and modal ('hide') methods to show and hide the login modal.

Reference
Before this article you should go through my Introduction to Bootstrap. Show Bootstrap Image Using Asp.Net MVC http://www.c-sharpcorner.com/blogs/bootstrap-image-show-using-asp-net-mvc3

Steps
Create a controller class file called "HomeController.cs" and add controller action method called "ModalPopUp()";
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.Mvc;  
  
namespace PeterMVCBootstrapImages.Controllers  
{  
    public class HomeController : Controller  
    {  
        //  
        // GET: /Home/  
  
        public ActionResult Index()  
        {  
            return View();  
        }  
  
        public ActionResult ModalPopUp()  
        {  
            return View();  
        }  
  
    }  


Then create a view file named "ModalPopUp.cshtml".
@{  
    ViewBag.Title = "
Peter Bootstrap PopUp";  
}  
  
<title>@ViewBag.Title</title>  
  
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">  
  
<style>  
    .button {  
        background-color: #4CAF50; /* Green */  
        border: none;  
        color: white;  
        padding: 15px 32px;  
        text-align: center;  
        text-decoration: none;  
        display: inline-block;  
        font-size: 16px;  
        margin: 4px 2px;  
        cursor: pointer;  
    }  
  
    .button1 {  
        border-radius: 2px;  
    }  
  
    .button2 {  
        border-radius: 4px;  
    }  
  
    .button3 {  
        border-radius: 8px;  
    }  
  
    .button4 {  
        border-radius: 12px;  
    }  
  
    .button5 {  
        border-radius: 50%;  
    }  
</style>  
<div>  
    <h2 style="background-color: Yellow;color: Blue; text-align: center; font-style: oblique">
Peter Bootstrap PopUp</h2>  
    <fieldset>  
        <legend style="color:orangered">Click On 
Peter Bootstrap PopUp</legend>  
        <div class="container">  
            <div class="row">  
                <div class="col-xs-12">  
  
                    <button id="btnShowModal" type="button"  
                            class="btn btn-sm btn-default pull-left col-lg-11 button button4">  
                        
Peter Modals  
                    </button>  
  
                    <div class="modal fade" tabindex="-1" id="loginModal"  
                         data-keyboard="false" data-backdrop="static">  
                        <div class="modal-dialog modal-lg">  
                            <div class="modal-content">  
                                <div class="modal-header">  
                                    <button type="button" class="close" data-dismiss="modal">  
                                        ×  
                                    </button>  
                                    <h4 class="modal-title">
Peter Login</h4>  
                                </div>  
                                <div class="modal-body">  
                                    <form>  
                                        <div class="form-group">  
                                            <input class="form-control" type="text"  
                                                   placeholder="Login Username" id="inputUserName" />  
                                        </div>  
                                        <div class="form-group">  
                                            <input class="form-control" placeholder="Login Password"  
                                                   type="password" id="inputPassword" />  
                                        </div>  
                                    </form>  
                                </div>  
                                <div class="modal-footer">  
                                    <button type="submit" class="btn btn-primary button button4">Sign</button>  
                                    <button type="button" id="btnHideModal" class="btn btn-primary button button4">  
                                        Hide  
                                    </button>  
                                </div>  
                            </div>  
                        </div>  
                    </div>  
  
                </div>  
            </div>  
        </div>  
    </fieldset>  
</div>  
    <footer>  
        <p style="background-color: Yellow; font-weight: bold; color:blue; text-align: center; font-style: oblique">  
            ©  
            <script> document.write(new Date().toDateString()); </script>  
        </p>  
    </footer>  
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js">  
    </script>  
    <script src="bootstrap/js/bootstrap.min.js"></script>  
  
    <script type="text/javascript">  
        $(document).ready(function () {  
            $("#btnShowModal").click(function () {  
                $("#loginModal").modal('show');  
            });  
  
            $("#btnHideModal").click(function () {  
                $("#loginModal").modal('hide');  
            });  
        });  
    </script> 

Here all reference files like bootstrap.min.css and jquery.min.js and bootstrap.min.js should be added to
add bootstrap features.
 
I have added code for a button to perform modal popup.
<button id="btnShowModal" type="button"  
       class="btn btn-sm btn-default pull-left col-lg-11 button button4">  
   
Peter Modals  
</button> 

I have added code for the modal form to appear in a fade style.
<div class="modal fade" tabindex="-1" id="loginModal"  
     data-keyboard="false" data-backdrop="static"> 
   

Here is the code for size of the modal.
<div class="modal-dialog modal-lg"> 

Controls are added Inside Modal content such as  header text , buttons, cross symbol button, text boxes and related control properties:
<div class="modal-content">  
    <div class="modal-header">  
        <button type="button" class="close" data-dismiss="modal">  
            ×  
        </button>  
        <h4 class="modal-title">
Peter Login</h4>  
    </div>  
    <div class="modal-body">  
        <form>  
            <div class="form-group">  
                <input class="form-control" type="text"  
                       placeholder="Login Username" id="inputUserName" />  
            </div>  
            <div class="form-group">  
                <input class="form-control" placeholder="Login Password"  
                       type="password" id="inputPassword" />  
            </div>  
        </form>  
    </div>  
    <div class="modal-footer">  
        <button type="submit" class="btn btn-primary button button4">Sign</button>  
        <button type="button" id="btnHideModal" class="btn btn-primary button button4">  
            Hide  
        </button>  
    </div>  
</div> 

For cross symbol button in header part.
<button type="button" class="close" data-dismiss="modal">  
    ×  
</button> 

For Header part.
<div class="modal-header">  
   <button type="button" class="close" data-dismiss="modal">  
       ×  
   </button>  
   <h4 class="modal-title">
Peter Login</h4>  
</div> 

For textBoxes

<div class="modal-body">  
    <form>  
        <div class="form-group">  
            <input class="form-control" type="text"  
                   placeholder="Login Username" id="inputUserName" />  
        </div>  
        <div class="form-group">  
            <input class="form-control" placeholder="Login Password"  
                   type="password" id="inputPassword" />  
        </div>  
    </form>  
</div> 


For footer part.
<div class="modal-footer">  
    <button type="submit" class="btn btn-primary button button4">Sign</button>  
    <button type="button" id="btnHideModal" class="btn btn-primary button button4">  
        Hide  
    </button>  
</div> 

Here I added one javascript and added button id such as btnShowModal and btnHideModal to show and hide modal.

<script type="text/javascript">  
    $(document).ready(function () {  
        $("#btnShowModal").click(function () {  
            $("#loginModal").modal('show');  
        });  

        $("#btnHideModal").click(function () {  
            $("#loginModal").modal('hide');  
        });  
    });  
</script> 


Here I added css style to add style in buttons.
<style>  
    .button {  
        background-color: #4CAF50; /* Green */  
        border: none;  
        color: white;  
        padding: 15px 32px;  
        text-align: center;  
        text-decoration: none;  
        display: inline-block;  
        font-size: 16px;  
        margin: 4px 2px;  
        cursor: pointer;  
    }  
  
    .button1 {  
        border-radius: 2px;  
    }  
  
    .button2 {  
        border-radius: 4px;  
    }  
  
    .button3 {  
        border-radius: 8px;  
    }  
  
    .button4 {  
        border-radius: 12px;  
    }  
  
    .button5 {  
        border-radius: 50%;  
    }  
</style>   




ASP.NET MVC Hosting - HostForLIFE.eu :: Controllers in MVC: An Introduction

clock June 12, 2025 09:06 by author Peter

This article provides an overview of the Controller in MVC. As you know, MVC stands for Model , View and Controller; so, Controller plays a very important role in MVC. We'll learn the controller actions and action results in here and how the controllers are used to interact with the MVC applications.

Overview
The controller in MVC is responsible for responding the request made against the ASP.NET MVC Web Application. Each browser request is mapped to a specific controller that is defined in the MVC application.

Suppose you are entering the following URL in the browser:
http://localhost:1234/Sample

It means that the Controller is called SampleController. The browser is making a request to the controller so now the SampleController is responsible for providing the response to the browser. It might be possible that the controller returns a specific view back to the browser or the controller might redirect the user to another controller.

Getting Started
Let us create a Controller in a MVC application. To create a controller you must have the MVC application so at first we'll create the MVC application and then controller. Just follow the procedure below.

Step 1: Create an ASP.NET Web Application and enter the name as in the following:

Step 2: Select MVC Project Template in the One ASP.NET Wizard.

Step 3: In the Solution Explorer, right-click on the Controllers folder then click on "Add" -> "Controller...".

Step 4: Now select the MVC Empty Controller.

And enter the name as Sample as in the following:


After entering the controller name, using scaffolding there is a folder named Sample (the same name as the newly added controller) will be added automatically in the Views folder. Have a look:


Step 5: You can see the newly added controller has code as in the following:
    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Web;  
    using System.Web.Mvc;  
    namespace DemoMvc.Controllers  
    {  
        public class SampleController : Controller  
        {  
            // GET: Sample  
            public ActionResult Index()  
            {  
                return View();  
            }  
        }  
    } 

In the code above, you can see that the controller is created in the form of a class so you can say that it is just a class that is derived from the Controller class. This class inherits the Controller class (base class). In the next section, we'll understand the actions.

Overview of Actions in Controller

The actions are disclosed by the controller. An action is a method on a controller that is called when you enter a specific URL in the browser. Suppose you enter the following URL in the browser:
http://localhost:1234/Sample/Index

The Index() method is called through the preceding URL. This Index() method is stored in the SampleController. It is necessary that the access modifier of the action method must be public. This action method of any controller cannot be overloaded further and also cannot be a static method.

Overview of Action Results
As you can see in the preceding action method that the return type of that Index() action method is ActionResult, so an action method returns an action result. An action result is what a controller action returns in response to a browser request.

There are various types of action results supported in the MVC, as given below:

  • ViewResult: Represents HTML and markup.
  • EmptyResult: No Result
  • RedirectResult: a redirection to a new URL
  • JsonResult: a JSON result that is used in ajax app
  • JavaScriptResult: a JavaScript result
  • ContentResult: a text result

In most cases the controller action returns a ViewResult as in the following:
    public class SampleController : Controller  
    {  
        // GET: Sample  
        public ActionResult Index()  
        {  
            return View();  
        }  
    } 


You can see in the code above that the View is used to return a ViewResult. When this is returned, HTML is returned to the browser. You can see the methods of the controller base class:

  • View: Returns a ViewResult action result.
  • Redirect: Returns a RedirectResult
  • JSON: Returns a JsonResult
  • JavaScript: Returns a JavaScriptResult
  • RedirectToAction: Returns a RedirectToActionResult

So, suppose you want to redirect from one controller to another controller, you need to use the RedirectToAction() method. Have a look:
    using System.Web.Mvc;  
    namespace DemoMvc.Controllers  
    {  
        public class SampleController : Controller  
        {  
            // GET: Sample  
            public ActionResult Index()  
            {  
                return View();  
            }  
            public ActionResult SampleWorld()  
            {  
                return RedirectToAction("Welcome");  
            }  
            public ActionResult Welcome()  
            {  
                return View();  
            }  
        }  
    } 

Suppose we want to use the ContentResult action result because it is special. It returns an action result as simple plain text. Have a look:

    using System.Web.Mvc;  
    namespace DemoMvc.Controllers  
    {  
        public class SampleController : Controller  
        {  
            // GET: Sample  
            public ActionResult Index()  
            {  
                return View();  
            }  
            public ActionResult Welcome()  
            {  
                return Content("Hello and Welcome to MVC");  
            }  
        }  
    } 


Adding View
You can add a view for every controller in a very easy way. Have a look at the following procedure.

Step 1: Just right-click on the controller and select Add View

Step 2: Just click on Add in the next wizard

 

Step 3: When you run the Welcome View, you can see the following screenshot

You can check out in the browser URL that the Welcome controller action method is called of the SampleController. That's it.

Summary
This article provided an overview of the controller, controller actions and action results of ASP.NET MVC. In here you learned the overview of controllers, next we'll learn the custom routes in controllers. Thanks for reading



ASP.NET MVC Hosting - HostForLIFE.eu :: Use the Dapper and Repository Patterns to Create a CRUD Application in.NET 8 MVC

clock May 7, 2025 09:33 by author Peter

Creating a CRUD (Create, Read, Update, Delete) application is a core skill for any .NET developer. In this guide, we'll show you how to build a CRUD app using ASP.NET Core MVC (.NET 8), Dapper ORM, and the Repository Pattern. This approach is fast, easy to maintain, and great for building real-world applications.


Building an ASP.NET MVC project using Dapper Micro ORM and .NET 8.0 involves 10 key steps. Here's a simple breakdown to help you set up the project effectively.

  • Create a New ASP.NET Core MVC Project
  • Install Dapper and Microsoft.Data.SqlClient Packages
  • Set Up SQL Server Database and Table
  • Configure Database Connection
  • Create the model
  • Create a DBContext Folder inside the folder create the DapperContext.cs file
  • Create a Repository Folder inside the folder create IStudentRepo.cs and StudentRepo.cs file
  • Configure Dependency Injection
  • Create Controller
  • Create Views

Continue following the steps mentioned above.

Step 1. Create a New ASP.NET Core MVC Project.

Choose the MVC project template.

Configure your new project by giving it a meaningful name and selecting the folder where it should be created.

No changes are needed in the Additional Information section.

The project window appears as shown in the image below.

Step 2. Install Dapper and Microsoft.Data.SqlClient Packages. Navigate to Tools > NuGet Package Manager > Manage NuGet Packages for Solution.

Go to the Browse tab, search for Dapper, and select the first package that appears. Check the box next to your project name, ensure the latest version is selected (update it if not), and then click Install.

Go to the Browse tab, and search for Microsoft.Data.SqlClient, and select the first package that appears. Tick the checkbox next to your project name, make sure the latest version is selected (update if necessary), and then click Install.

Click Accept to agree to the license terms and proceed with the installation.


Open Solution Explorer, navigate to Dependencies > Packages and verify that both installed packages are listed. This confirms they were successfully added to your project.


Step 3. Set Up SQL Server Database and Table
Open SQL Server Management Studio (SSMS), then launch a New Query window. Use the following query to create a new database and table.
--Create a database StudentDB.
CREATE DATABASE StudentDB;
Use StudentDB;

--Create a table Students with fields: ID, Name, Age, Email.
CREATE TABLE Student(
               ID int primary key identity(1,1),
               Name varchar(50),
               Age int,
               Email varchar(50)
);

Step 4. Configure Database Connection
Add the connection string to the appsettings.json file, ensuring that the entries are separated by commas (,).


"ConnectionStrings": {
    "DefaultConnection": "Server=LAPTOP-TD1MGGBL;Database=StudentDB;Trusted_Connection=True;TrustServerCertificate=True;"
}


Step 5. Create the model
Right-click on the Models folder, select Add > Class and name it Student.cs. After creating the class, add the following code.


File: Student.cs
namespace CURD_Demo.Models
{
    public class Student
    {
        public int Id { get; set; }
        public required string Name { get; set; }
        public int Age { get; set; }
        public required string Email { get; set; }
    }
}


Step 6. Create a DBContext Folder inside the folder ADD DapperContext.cs file.
Right-click on the project name in Solution Explorer, then go to Add > New Folder and name it DBContext. Inside the DBContext folder, add a class named DapperContext.cs and include the following code inside the file.

 

File: DappContext.cs
using Microsoft.Data.SqlClient;
using System.Data;

namespace CURD_Demo.DBContext
{
    public class DapperContext
    {
        private readonly IConfiguration _configuration;
        private readonly string? _connectionString;
        public DapperContext(IConfiguration configuration)
        {
            _configuration = configuration;
            _connectionString = _configuration.GetConnectionString("DefaultConnection");
        }
        public IDbConnection CreateConnection() => new SqlConnection(_connectionString);
    }
}


Step 7. Create a Repository Folder inside the folder then create IStudentRepo.cs and StudentRepo.cs files.
Right-click on the project name in Solution Explorer, then go to Add > New Folder and name it Repository. Inside the Repository folder, add an interface named IStudentRepo.cs and a class named StudentRepo.cs. After creating these files, add the following code inside each file.


File: IStudentRepo.cs
using CURD_Demo.Models;

namespace CURD_Demo.Repository
{
    public interface IStudentRepo
    {
        IEnumerable<Student> GetAll();
        Student? GetById(int id);
        void Add(Student student);
        void Update(Student student);
        void Delete(int id);
    }
}


File: StudentRepo.cs
using CURD_Demo.Models;
using CURD_Demo.DBContext;
using Dapper;
namespace CURD_Demo.Repository
{
    public class StudentRepo : IStudentRepo
    {
        private readonly DapperContext _context;
        public StudentRepo(DapperContext context)
        {
            _context = context;
        }
        public IEnumerable<Student> GetAll()
        {
            using (var connection = _context.CreateConnection())
            {
                var sql = "SELECT * FROM Student";
                return connection.Query<Student>(sql);
            }
        }
        public Student? GetById(int id)
        {
            using (var connection = _context.CreateConnection())
            {
                var sql = "SELECT * FROM Student WHERE Id = @Id";
                return connection.QuerySingleOrDefault<Student>(sql, new { Id = id });
            }
        }
        public void Add(Student student)
        {
            using (var connection = _context.CreateConnection())
            {
                var sql = "INSERT INTO Student (Name, Age, Email) VALUES (@Name, @Age, @Email)";
                connection.Execute(sql, student);
            }
        }
        public void Update(Student student)
        {
            using (var connection = _context.CreateConnection())
            {
                var sql = "UPDATE Student SET Name = @Name, Age = @Age, Email = @Email WHERE Id = @Id";
                connection.Execute(sql, student);
            }
        }
        public void Delete(int id)
        {
            using (var connection = _context.CreateConnection())
            {
                var sql = "DELETE FROM Student WHERE Id = @Id";
                connection.Execute(sql, new { Id = id });
            }
        }
    }
}


Step 8. Configure Dependency Injection
Open the Program.cs file and add the necessary dependencies for Dapper and the repositories using the following code.


File: Program.cs
//Configure Dependency Injection

builder.Services.AddSingleton<CURD_Demo.DBContext.DapperContext>();
builder.Services.AddScoped<CURD_Demo.Repository.IStudentRepo, CURD_Demo.Repository.StudentRepo>();


Step 9. Create Controller
Right-click on the Controllers folder, select Add > Controller, then choose MVC Controller - Empty and click Add. In the pop-up window, enter StudentController as the controller name and click Add. This will create StudentController inside the Controllers folder. Then, add the following code to the StudentController.cs file.

 

File: StudentController.cs
using CURD_Demo.Models;
using Microsoft.AspNetCore.Mvc;
using CURD_Demo.Repository;

namespace CURD_Demo.Controllers
{
    public class StudentController : Controller
    {
        private readonly IStudentRepo _studentRepo;
        public StudentController(IStudentRepo studentRepo)
        {
            _studentRepo = studentRepo;
        }
        public IActionResult Student()
        {
            var students = _studentRepo.GetAll();
            return View(students);
        }
        public IActionResult Details(int id)
        {
            var student = _studentRepo.GetById(id);
            if (student == null)
            {
                return NotFound();
            }
            return View(student);
        }
        public IActionResult Create()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Create(Student student)
        {
            if (ModelState.IsValid)
            {
                _studentRepo.Add(student);
                return RedirectToAction(nameof(Student));
            }
            return View(student);
        }
        public IActionResult Edit(int id)
        {
            var student = _studentRepo.GetById(id);
            if (student == null)
            {
                return NotFound();
            }
            return View(student);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Edit(Student student)
        {
            if (ModelState.IsValid)
            {
                _studentRepo.Update(student);
                return RedirectToAction(nameof(Student));
            }
            return View(student);
        }
        public IActionResult Delete(int id)
        {
            var student = _studentRepo.GetById(id);
            if (student == null)
            {
                return NotFound();
            }
            return View(student);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult DeleteConfirmed(int id)
        {
            _studentRepo.Delete(id);
            return RedirectToAction(nameof(Student));
        }
    }
}


Step 10. Create Views
Right-click on the Views folder, navigate to Add > New Item, select Razor View - Empty, and click Add. In the pop-up window, enter Student.cshtml as the name and click Add. This will create a Student.cshtml file inside the View/Student folder. Then, add the following code inside the Student.cshtml file.

 

File: Student.cshtml
@model IEnumerable<CURD_Demo.Models.Student>
@{
    ViewData["Title"] = "Students";
}

<h2>Student List</h2>

<div>
    <a asp-action="Create" class="btn btn-primary">Add New Student</a>
</div>
<table class="table table-bordered">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Email)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Age)
            </th>
            <th>
                Actions
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var student in Model)
        {
            <tr>
                <td>
                    @{
                        @student.Name
                    }
                </td>
                <td>
                    @{
                        @student.Email
                    }
                </td>
                <td>
                    @{
                        @student.Age
                    }
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@student.Id">Edit</a> |
                    <a asp-action="Delete" asp-route-id="@student.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Right-click on the Student folder, navigate to Add > New Item, select Razor View - Empty, and click Add. In the pop-up window, enter Create.cshtml as the name and click Add. This will create a Create.cshtml file inside the Student folder. Then, add the following code inside the Create.cshtml file.

File: Create.cshtml

@model CURD_Demo.Models.Student
@{
    ViewData["Title"] = "Create Student";
}

<h2>Add Student</h2>
<form asp-action="Create" method="post">
    <div class="form-group">
        <label for="Name" class="form-label"></label>
        <input name="Name" placeholder="Enter Your Name" class="form-control" />
        <span class="text-danger"></span>
    </div>
    <div class="form-group">
        <label for="Email" class="control-label"></label>
        <input name="Email" placeholder="Enter Your Email" class="form-control" />
        <span class="text-danger"></span>
    </div>
    <div class="form-group">
        <label for="Age" class="control-label"></label>
        <input name="Age" placeholder="Enter Your Age" class="form-control" />
        <span class="text-danger"></span>
    </div>
    <button type="submit" class="btn btn-primary">Create</button>
    <a asp-action="Student">Back</a>
</form>


Right-click on the Student folder, navigate to Add > New Item, select Razor View - Empty, and click Add. In the pop-up window, enter Edit.cshtml as the name and click Add. This will create a Edit.cshtml file inside the Student folder. Then, add the following code inside the Edit.cshtml file.

File: Edit.cshtml
@model CURD_Demo.Models.Student
@{
    ViewData["Title"] = "Edit";
}

<h2>EditStudent</h2>
<form asp-action="Edit" metod="post">
    <input type="hidden" asp-for="Id" />
    <div class="form-group">
        <label asp-for="Name" class="form-label"></label>
        <input asp-for="Name" placeholder="Enter Your Name" class="form-control" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Email" class="form-label"></label>
        <input asp-for="Email" placeholder="Enter Your Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="Age" class="form-label"></label>
        <input asp-for="Age" placeholder="Enter Your Age" class="form-control" />
        <span asp-validation-for="Age" class="text-danger"></span>
    </div>
    <button type="submit" class="btn btn-primary">Update</button>
</form>

Right-click on the Student folder, navigate to Add > New Item, select Razor View - Empty, and click Add. In the pop-up window, enter Delete.cshtml as the name and click Add. This will create a Delete.cshtml file inside the Student folder. Then, add the following code inside the Delete.cshtml file.

File: Delete.cshtml
@model CURD_Demo.Models.Student
@{
    ViewData["Title"] = "Delete";
}

<h2>Delete Student</h2>
<div>
    <h4>Are you sure you want to delete this Student?</h4>
    <div>
        <p>Name: @Model.Name</p>
        <p>Email: @Model.Email</p>
        <p>Age: @Model.Age</p>
    </div>
</div>

<form method="post" asp-action="DeleteConfirmed">
    <input type="hidden" asp-for="Id" />
    <div class="form-group">
        <button type="submit" class="btn btn-danger">Delete</button>
        <a asp-action="Index" class="btn btn-secondary">Cancel</a>
    </div>
</form>

Conclusion

In this article, we walked through the process of building a complete CRUD application using ASP.NET Core MVC (.NET 8), Dapper ORM, and the Repository Pattern. By combining the simplicity and performance of Dapper with a clean architecture approach, you’ve created a project that is both efficient and easy to maintain. This setup is ideal for small to medium-sized applications where performance matters and development speed is important. Whether you're a beginner exploring .NET or a developer looking to use lightweight tools over heavy ORMs, this project serves as a solid foundation for real-world applications.

Thank you for taking the time to read this article! I hope it helped you understand how to build a CRUD application using ASP.NET Core MVC, Dapper ORM, and the Repository Pattern. If you found this guide helpful, feel free to share it with others or leave your feedback.

Happy coding!



ASP.NET MVC Hosting - HostForLIFE.eu :: Building a User Subscription Module in ASP.NET MVC with C# 14

clock April 29, 2025 10:00 by author Peter

In modern web applications, subscription-based features are essential for managing user access, monetizing content, or offering tiered services. In this guide, we will build a comprehensive User Subscription Module using ASP.NET MVC (Model-View-Controller) and C# 14. The module will support:

  • User registration and login
  • Subscription plan selection
  • Payment integration (mocked)
  • Role-based access based on subscription level
  • Subscription management (upgrade/downgrade/cancel)

We’ll also take advantage of new C# 14 features such as primary constructors, collection expressions, field-backed properties, and extension members to make our code more concise and modern. These features help streamline the codebase and make it easier to read and maintain, especially in large applications with many interrelated components.

By the end of this tutorial, you'll have a functioning module that you can integrate into an existing ASP.NET MVC project. Whether you're building a SaaS platform or a content subscription service, the patterns and practices here will provide a strong foundation for building reliable, scalable subscription systems.

1. Project Setup
The first step in developing our subscription module is to use Visual Studio to create a new ASP.NET MVC application. Our data models, business logic, and user interface elements will be constructed upon this basis. Select the MVC template and set up your authentication preferences according to your user base's requirements when prompted during project creation. In order to enable Entity Framework and ASP.NET Identity, which are essential to our user and subscription management features, we must install a few NuGet packages after building the project. Microsoft, for instance. We may construct our database access layer and Microsoft.AspNet.Identity using EntityFramework. EntityFramework offers the ability to authenticate users.

Install-Package Microsoft.EntityFramework -Version 6.4.4
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Stripe.net // Optional for real payment integration

These packages lay the groundwork for our entire system. With Entity Framework, we can interact with the database using strongly typed models, and Identity gives us a comprehensive system for managing users and roles. The Stripe package is optional but included for future scalability and integration.

Using NuGet simplifies the setup process and ensures that you get the latest, most secure versions of each dependency. This modular approach also makes the project easier to maintain, since each package can be updated independently of the others.

2. Define Models

To store and manage subscription data, we need to define our data models. These include SubscriptionPlan for defining available plans, UserSubscription to represent a user’s active or past subscriptions, and ApplicationUser which extends ASP.NET Identity’s user model. Each of these models plays a key role in organizing how data is stored and retrieved.

public class SubscriptionPlan
{
    public int Id { get; set; }

    public string Name
    {
        get => field;
        set => field = value ?? throw new ArgumentNullException(nameof(value));
    }

    public decimal Price { get; set; }
    public string Description { get; set; }
    public int DurationInDays { get; set; }
}

public class UserSubscription
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public int PlanId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public bool IsActive => DateTime.UtcNow <= EndDate;

    public virtual ApplicationUser User { get; set; }
    public virtual SubscriptionPlan Plan { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<UserSubscription> Subscriptions { get; set; }
}

These classes map to tables in our SQL database and help organize our business logic. The use of navigation properties (virtual) allows us to navigate related entities easily when using Entity Framework. The UserSubscription model is especially critical for tracking start and end dates, which will be used to determine access.

In C# 14, field-backed properties like Name in SubscriptionPlan help ensure data integrity with built-in validation. This allows us to enforce rules such as requiring names to be non-null directly in the model, rather than repeating this logic throughout the codebase.

3. Add Subscription Logic to DbContext

Next, we extend our DbContext to include our new models. This allows us to use EF to manage our tables and data.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<SubscriptionPlan> SubscriptionPlans { get; set; }
    public DbSet<UserSubscription> UserSubscriptions { get; set; }

    public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { }

    public static ApplicationDbContext Create() => new();
}

This DbContext class bridges your application to the database. Entity Framework uses it to perform CRUD operations and generate SQL queries under the hood. The DbSet<T> properties tell EF which entities should be tracked and mapped to database tables.

The constructor and factory method (Create) show how to simplify context initialization, and using the latest syntax from C# 14 makes it even more concise. Keeping the context clean and modular helps when unit testing or transitioning to more advanced patterns like repository or unit-of-work.

4. Seed Subscription Plans
Add seed data to initialize plans in development or production environments.

context.SubscriptionPlans.AddOrUpdate(p => p.Name,
    new SubscriptionPlan { Name = "Free", Price = 0, Description = "Basic access", DurationInDays = 30 },
    new SubscriptionPlan { Name = "Pro", Price = 9.99M, Description = "Pro features", DurationInDays = 30 },
    new SubscriptionPlan { Name = "Enterprise", Price = 29.99M, Description = "All features", DurationInDays = 90 }
);

Seeding is essential to provide default options without requiring manual input every time the database is recreated. This is useful not only in development but also in CI/CD pipelines for automated deployments. These plans can be adjusted or extended later to suit business needs.

This code ensures that users always have valid plans to choose from. It's especially useful when the app is first launched, ensuring a smooth experience from the very first interaction.
5. Controllers and Views
Here’s a controller that uses a primary constructor:
[Authorize]
public class SubscriptionController(ApplicationDbContext db) : Controller
{
    public ActionResult Index() => View(db.SubscriptionPlans.ToList());

    public ActionResult Subscribe(int id) => View(db.SubscriptionPlans.Find(id));

    [HttpPost]
    public ActionResult SubscribeConfirmed(int id)
    {
        var userId = User.Identity.GetUserId();
        var plan = db.SubscriptionPlans.Find(id);

        var subscription = new UserSubscription
        {
            UserId = userId,
            PlanId = plan.Id,
            StartDate = DateTime.UtcNow,
            EndDate = DateTime.UtcNow.AddDays(plan.DurationInDays)
        };

        db.UserSubscriptions.Add(subscription);
        db.SaveChanges();

        return RedirectToAction("MySubscription");
    }

    public ActionResult MySubscription()
    {
        var userId = User.Identity.GetUserId();
        var activeSub = db.UserSubscriptions
            .Include("Plan")
            .Where(s => s.UserId == userId && s.IsActive)
            .OrderByDescending(s => s.EndDate)
            .FirstOrDefault();

        return View(activeSub);
    }
}


This controller manages the user's interaction with subscription plans. It retrieves available plans, handles subscription actions, and displays the user's current subscription. Using C# 14 primary constructors simplifies dependency injection, especially when there are few dependencies.

The controller is tied to Identity for user management, ensuring that actions like subscribing are tied to the correct user context. This integration of business logic and authentication is central to secure and personalized application flows.

6. Access Control Based on Subscription

Create a custom authorization attribute:
public class SubscriptionAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var userId = httpContext.User.Identity.GetUserId();
        var db = new ApplicationDbContext();
        var sub = db.UserSubscriptions.FirstOrDefault(x => x.UserId == userId && x.EndDate >= DateTime.UtcNow);
        return sub != null;
    }
}


Use it like this:
[SubscriptionAuthorize]
public ActionResult PremiumContent()
{
    return View();
}


This custom attribute checks if the logged-in user has an active subscription. It’s a lightweight and reusable solution to protect controller actions or entire controllers. It works well for scenarios where only subscribers should access certain parts of the application.

By encapsulating this logic into an attribute, we keep our controller actions clean and focused on what they need to do, rather than how authorization should be enforced. This improves both readability and maintainability.

7. Optional: Mock Payment Service

Handling payments is a critical part of any subscription system, but during development or for MVP testing, it's useful to mock this functionality. A mock payment service allows us to simulate successful transactions without integrating a third-party provider like Stripe or PayPal.

Below is a simple mock PaymentService class. It returns true to simulate a successful payment transaction, regardless of input. This allows you to develop and test your system logic without incurring real charges or managing payment API credentials.
public class PaymentService
{
    public bool ChargeUser(string userId, decimal amount)
    {
        // Simulate a successful payment
        Console.WriteLine($"Charging user {userId} for ${amount}");
        return true;
    }
}


You can integrate this into your subscription flow by calling it before saving the subscription. For example:
var paymentService = new PaymentService();
if (paymentService.ChargeUser(userId, plan.Price))
{
    var subscription = new UserSubscription
    {
        UserId = userId,
        PlanId = plan.Id,
        StartDate = DateTime.UtcNow,
        EndDate = DateTime.UtcNow.AddDays(plan.DurationInDays)
    };

    db.UserSubscriptions.Add(subscription);
    db.SaveChanges();
}

Using a mock now allows you to fully test your end-to-end subscription logic while making it simple to switch to a real provider later. When you're ready for live payments, just replace it PaymentService with a real implementation that connects to your gateway of choice.

8. Extension Members in C# 14

Use extension members to clean check the premium status:
public static class SubscriptionExtensions
{
    extension(UserSubscription subscription)
    {
        public bool IsPremium => ["Pro", "Enterprise"].Contains(subscription.Plan?.Name);
    }
}


Then in your code:

if (userSubscription.IsPremium)
{
    // Show premium features
}

Extension members let you encapsulate logic related to a class without modifying the class itself. This is ideal for computed properties like determining plan tier. It keeps your domain model lean while making your code more expressive. This feature is especially useful in scenarios where your business logic spans multiple types or you need utility-style operations across many parts of the app. You avoid cluttering your core model with too much logic.

9. Views

Here's a simple Index.cshtml:
@model IEnumerable<SubscriptionPlan>
<h2>Choose a Plan</h2>
@foreach (var plan in Model)
{
    <div>
        <h3>@plan.Name</h3>
        <p>@plan.Description</p>
        <p>Price: [email protected]</p>
        @Html.ActionLink("Subscribe", "Subscribe", new { id = plan.Id })
    </div>
}

This view lists all available subscription plans. Each plan includes a button that links to the subscribe confirmation page. The use of Razor syntax makes it easy to iterate through models and generate dynamic HTML. Views like this help users quickly understand the value proposition of each plan. With Bootstrap or Tailwind CSS, you could further enhance the design for a polished, responsive experience.

Conclusion

We built a user subscription module using ASP.NET MVC and C# 14, leveraging modern language features for better performance and readability. We explored models, controllers, access control, extension methods, and mocked payment processing. This provides a solid foundation for a SaaS or subscription-based application. Next steps might include adding webhook support, real payment integration (e.g., Square, Stripe), user dashboards, or analytics.



ASP.NET MVC Hosting - HostForLIFE.eu :: How to Use View Files to Publish ASP.NET Core MVC Project.NET 8?

clock April 15, 2025 07:29 by author Peter

This walkthrough will address the following questions and teach you how to publish CSHTML files along with the project.

  • How to create an Asp.Net Core MVC Project?
  • What are the settings for the Project file to publish the CSHTML file while publishing?
  • What are the settings to be done on the publish screen or wizards before publishing?

We are using Visual Studio 2022 for this walk-through.


How to create an ASP.NET Core MVC Project?

Select ASP.NET Core web App (Model-View-Controller as per IMAGE1.

Set the following things in the above image 2:

  • Project name: Set your project name: AspNetMvcNet8Proj.
  • Location: Set your location by clicking… or select previous by clicking on the dropdown list.

  • Framework: Select your .NET version (6.0, 8.0. . .)

We selected .NET 8

  • Authentication Type: None
  • (You can select as per your requirement – None, Individual Accounts, Microsoft Identity Platform, or Windows)
  • Configure for HTTPS: Set Configure for HTTPS for secure request and response.
  • Enable Container Support: Select Docker for Windows or Linux operating system.

After the above selection, choose as per your project requirement. Click on the CREATE button to proceed toward creating a new project.

Press F5 to run the project.


You can see the above project executed successfully.

The next step is to publish the project with a CSHTML file by default while publishing all views files compiled and output into one DLL (assembly). No external CSHTML published.

What are the settings for the Project file to publish the CSHTML file while publishing?

Right-click on the project
Select “Unload Project”

Default Content:
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

</Project>

Change the file to the following settings:
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <PreserveCompilationContext>true</PreserveCompilationContext>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>

    <!-- To publish views instead of views.dll -->
    <EnableDefaultRazorGenerateItems>false</EnableDefaultRazorGenerateItems>
    <EnableDefaultRazorComponentItems>false</EnableDefaultRazorComponentItems>
    <CopyRazorGenerateFilesToPublishDirectory>true</CopyRazorGenerateFilesToPublishDirectory>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.0" />

    <!-- Explicitly include each .cshtml file in the subfolders under Views -->
    <Content Update="Views\**\*.cshtml" CopyToPublishDirectory="PreserveNewest" />
  </ItemGroup>

</Project>

After updating the above settings in the file, close the file again, right-click on the project, and click on “Reload Project”. In the Next step, we set and configure Publish settings.

What are the settings to be done on the publish screen or wizards before publishing?

After Right click on the project, select the “Publish” option.

Select the FOLDER option to publish on the Local Folder and click on the NEXT button.

Select or create a folder where you want to publish the project. Click on the FINISH button after you select the folder location.

Click on Show All settings to set your publish setting more precisely, or directly click on the PUBLISH button. Output of Publish Button:

Error Message: Views\Shared\_Layout.cshtml.css(0,0): Error BLAZOR102: The scoped css file 'Views\Shared\_Layout.cshtml.css' was defined, but no associated razor component or view was found for it.

You can see the error thrown by the publishing process in (Image-10 and Image-11).

Error Solution

Solution 1
You can delete the CSS file “View/Shared/Layout.cshtml” and publish it again.

Solution 2
If you want CSS style or content of the CSS file “View/Shared/Layout.cshtml,” you can create a new CSS file and move this file into the “wwwroot/css” folder and assign the link in the “view/shared/Layout.cshtml” file.


VIEW published successfully

Folder View

You can see in Image-13 and Image-14 Views files were published successfully.



ASP.NET MVC Hosting - HostForLIFE.eu :: Understanding Controller In ASP.NET MVC

clock March 26, 2025 08:41 by author Peter

Here, in this article, we will see more about the controllers and understanding about RouteConfig File. I will be using the same solution which we had used in our previous article. Thus, let's start an introduction.

Open our solution MVCTestApplication, given below:

You can see in our Home Controller class; we have two Action methods; one is Index() and other is HelloAll() . The Index methods are invoked, when you run the Application. Now, just run the Application and you will see:

By default, Hello CsharpCorner has been displayed, because in RouteConfig file, the default action method is Index and we had written “Hello HostForLIFE ” in Index Action Method.

Now, let's type the URL i.e. ControllerName/ActionName and see what we are getting:

As you can see, we had got the same result: “Hello CsharpCorner.” Here, Home is our ControllerName and Index is our Action Method . Similarly, we will see our second Action Method i.e. HelloAll()

As you can see, HelloAll() Action Method has been invoked. Now, let's understand RouteConfig and how these controllers are displayed. Just Open global.asax file in our solution and you will see:

 

Open this file and you will see Application_start () method, in which you will see this line as:

Go to its Definition section, it will redirect to RouteConfig File and you will see:

 

In RouteConfig class, we have default document as:
name:”Default”-Specifies the name

URL: “{Controller}/{action}/{id}” – This line actually says that when you run the solution by default, it will first fire the controllername/index and then Id.

Defaults: As you can see, the default controller' s Home is called and is followed by the action Index and then Id. Note: Here the specified Id is normal and if you want to retrieve the results, you have to pass the Id.

Now, we will see how to pass the Id in our URL and see what output we are getting. Hence, let's start:

In our Homecontroller class, in our Index Action method, just pass a parameter as a string name and return as a name . Now, we will run the Application and see what values we are getting.

When you run the solution, it will ask for the name. Now, let's pass the name in our URL:

As you can see in the output, given above, it had passed Id=1 and got Id=1. Just type Home/index/1 an you will get the output, given above. Now, we will modify the code, write the name and see the output that we will get:

I had passed the name. Now, run the Application. You will see the following output:

Now, just pass the Id and name. We saw the last Id, how to specify the Id or name and how to display it. Now, let's get back to the RouteConfig file and understand the line, given below:

Here, what this line says is: Whatever you are doing in the Controller or in the Index Action method, a trace is getting generated in the form of axd format. We will see how these are generated and how to generate a resource.axd trace. Just open web.config file, shown below:

Just write this line in your web.config file.

Now, run the Application and type trace.axd. You will see the following output:

Click the View details and you will get all the details, shown below:

Scroll down at the bottom of the page and you will see that its path, query string and its respective URLs are:

The trace.axd is useful, when you have built a huge application and you require tracing to find out the details. Conclusion: This was controllers in MVC. I hope you found this article helpful.



About HostForLIFE.eu

HostForLIFE.eu is European Windows Hosting Provider which focuses on Windows Platform only. We deliver on-demand hosting solutions including Shared hosting, Reseller Hosting, Cloud Hosting, Dedicated Servers, and IT as a Service for companies of all sizes.

We have offered the latest Windows 2016 Hosting, ASP.NET Core 2.2.1 Hosting, ASP.NET MVC 6 Hosting and SQL 2017 Hosting.


Tag cloud

Sign in