Asp.Net Core Creating Forms In Razor Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of ASP.NET Core Creating Forms in Razor

1. Understanding the Basics

Razor Pages: Introduced in ASP.NET Core 2.0, Razor Pages allows for building web UI using a page-based coding model. It simplifies working with forms, data validation, and posting data.

MVC (Model-View-Controller): A common pattern used in web development to separate applications into manageable components. While Razor Pages are page-based, they still adhere to MVC principles, including model binding and validation.

2. Setting Up Your Environment

Ensure you have the latest version of .NET Core SDK installed. You can create a new Razor Pages application using:

dotnet new razor -n MyRazorApp
cd MyRazorApp
dotnet run

3. Creating a Simple Form

Let’s start by creating a simple form that collects user input such as name, email, and password.

Step 1: Create the Model

Define a model that represents the form data you want to collect. C# classes are used for models.

public class User
{
    [Required]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
    public string Password { get; set; }
}

This model includes data annotations for validation, which Razor Pages automatically understands.

Step 2: Create the Razor Page

Create a Razor Page that will render the form and handle the form submission.

Create a file named CreateUser.cshtml in the /Pages directory.

CreateUser.cshtml (HTML markup):

@page
@model MyRazorApp.Pages.CreateUserModel
@{
    ViewData["Title"] = "Create User";
}

<h2>@ViewData["Title"]</h2>

<form method="post">
    <div class="form-group">
        <label asp-for="User.Name"></label>
        <input asp-for="User.Name" class="form-control" />
        <span asp-validation-for="User.Name" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="User.Email"></label>
        <input asp-for="User.Email" class="form-control" />
        <span asp-validation-for="User.Email" class="text-danger"></span>
    </div>
    <div class="form-group">
        <label asp-for="User.Password"></label>
        <input asp-for="User.Password" class="form-control" type="password" />
        <span asp-validation-for="User.Password" class="text-danger"></span>
    </div>
    <button type="submit" class="btn btn-primary">Register</button>
</form>

CreateUser.cshtml.cs (page handler):

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;

namespace MyRazorApp.Pages
{
    public class CreateUserModel : PageModel
    {
        [BindProperty]
        public User User { get; set; }

        public void OnGet()
        {
            // Code to execute when the page is requested via GET
        }

        public IActionResult OnPost()
        {
            if (!ModelState.IsValid)
            {
                // If validation fails, redisplay the form with the entered data
                return Page();
            }

            // Save the user data to a database or perform any other action
            // For demonstration, we'll just return the user data as a message
            return RedirectToPage("/Success", new { name = User.Name });
        }
    }
}

4. Handling Validation

ASP.NET Core Razor Pages automatically handle model validation. If validation fails, the form is redisplayed with error messages.

Data Annotations:

  • [Required]: Marks the field as required.
  • [EmailAddress]: Validates the email format.
  • [DataType(DataType.Password)]: Changes the input type to password.
  • [StringLength]: Sets minimum and maximum length for the string.

5. Redirecting on Success

After a successful form submission, consider redirecting to another page, such as a success page.

Success.cshtml:

@page
@model MyRazorApp.Pages.SuccessModel
@{
    ViewData["Title"] = "Success";
}

<h2>@ViewData["Title"]</h2>

<p>Thank you, @Model.Name! Your registration was successful.</p>

Success.cshtml.cs:

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement ASP.NET Core Creating Forms in Razor

Step 1: Set Up Your ASP.NET Core Project

First, ensure you have .NET Core SDK installed on your machine. You can also use Visual Studio or Visual Studio Code.

  1. Create a new project: Open your terminal or command prompt and run the following commands:

    dotnet new webapp -n FormApp
    cd FormApp
    
  2. Open the project: You can open the project in Visual Studio Code by running the command:

    code .
    

Step 2: Create a Model

Create a model that represents the data you want to collect from the form.

  1. Create a Models folder: In the file explorer, right-click on the project (FormApp) and select New Folder. Name it Models.

  2. Create a model file: Inside the Models folder, create a new C# class file named Contact.cs and add the following code:

    using System.ComponentModel.DataAnnotations;
    
    namespace FormApp.Models
    {
        public class Contact
        {
            [Required]
            [StringLength(100, ErrorMessage = "Name is too long.")]
            public string Name { get; set; }
    
            [Required]
            [EmailAddress]
            public string Email { get; set; }
    
            [StringLength(1000, ErrorMessage = "Message is too long.")]
            public string Message { get; set; }
        }
    }
    

Step 3: Create a Razor Page

Create a Razor Page to handle the form display and processing logic.

  1. Create a Pages folder: This should already exist. If not, create a folder named Pages.

  2. Create a new Razor Page: Inside the Pages folder, create a new Razor Page named Contact.cshtml. Also, create a code-behind file for logic named Contact.cshtml.cs.

  3. Contact.cshtml: This file will contain the HTML markup for your form.

    @page
    @model FormApp.Pages.ContactModel
    @{
        ViewData["Title"] = "Contact";
    }
    
    <h2>@ViewData["Title"]</h2>
    
    @if (!string.IsNullOrEmpty(Model.Message))
    {
        <p>@Model.Message</p>
    }
    
    <form method="post">
        <div class="form-group">
            <label asp-for="Contact.Name"></label>
            <input asp-for="Contact.Name" class="form-control" />
            <span asp-validation-for="Contact.Name" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Contact.Email"></label>
            <input asp-for="Contact.Email" class="form-control" />
            <span asp-validation-for="Contact.Email" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Contact.Message"></label>
            <textarea asp-for="Contact.Message" class="form-control"></textarea>
            <span asp-validation-for="Contact.Message" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-primary">Send</button>
    </form>
    
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }
    
  4. Contact.cshtml.cs: This file will contain the logic for handling the form submission.

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    using FormApp.Models;
    
    namespace FormApp.Pages
    {
        public class ContactModel : PageModel
        {
            [BindProperty]
            public Contact Contact { get; set; }
    
            public string Message { get; set; }
    
            public void OnGet()
            {
            }
    
            public IActionResult OnPost()
            {
                if (!ModelState.IsValid)
                {
                    return Page();
                }
    
                // Process the data (e.g., save to a database, send an email, etc.)
                Message = $"Thank you, {Contact.Name}! We will get back to you at {Contact.Email}.";
    
                return Page();
            }
        }
    }
    

Step 4: Enable Client-Side Validation

To enable client-side validation, ensure that you have the necessary validation scripts included. These scripts should already be included in the project template, but you can verify them.

  1. Update _ValidationScriptsPartial.cshtml: Open the Views/Shared/_ValidationScriptsPartial.cshtml file (or the equivalent in your project, it might be under Pages/Shared).

    <environment include="Development">
        <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
        <script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js"
                asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.validator"
                crossorigin="anonymous"
                integrity="sha384-rZfj/ogBloos6w9W+L4qOSa5GfZLmBxXZcoU3UI1pMclhJ2sylzUC Ulq1lRsPFFplkhhCAoW5" />
        <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
                asp-fallback-src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
                crossorigin="anonymous"
                integrity="sha384-0di6AQiK/nzpbUtH9P6OokRJBiQmI9Y/5DpdXID0RcGzLKp2Ov5UFX/OFiH+cuC" />
    </environment>
    

Step 5: Run the Application

Run the application to see the form in action. Open your terminal or command prompt, navigate to your project directory, and run:

dotnet run

Navigate to https://localhost:5001/Contact in your web browser. You should see the contact form. Try to submit the form with valid and invalid data to see the validation in action.

Conclusion

Top 10 Interview Questions & Answers on ASP.NET Core Creating Forms in Razor

1. How do I create a simple form in ASP.NET Core using Razor?

Answer:
You can create a simple form in ASP.NET Core using Razor by defining it within a .cshtml page. Here’s a basic example for a simple form that collects a user's name and email:

@model RegisterViewModel

<form asp-controller="Home" asp-action="Register" method="post">
    <div>
        <label asp-for="Name"></label>
        <input asp-for="Name" />
        <span asp-validation-for="Name"></span>
    </div>
    <div>
        <label asp-for="Email"></label>
        <input asp-for="Email" />
        <span asp-validation-for="Email"></span>
    </div>
    <button type="submit">Register</button>
</form>

Ensure you have a RegisterViewModel class that defines properties for Name and Email, and a Register action method within your HomeController that handles the POST request.

2. How can I handle form submissions in ASP.NET Core?

Answer:
To handle form submissions, define an action method in your controller that matches the form's asp-action attribute. This method should be decorated with the [HttpPost] attribute to specify that it handles POST requests:

public class HomeController : Controller
{
    [HttpPost]
    public IActionResult Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            // Process the data, save it to a database, etc.
            return RedirectToAction("Success");
        }

        // If model is not valid, return the view with validation errors
        return View(model);
    }
}

3. What is the purpose of asp-for in Razor forms?

Answer:
The asp-for attribute is used to bind form controls to model properties. It provides a strongly-typed way to associate HTML elements with model properties, enabling features like model validation and IntelliSense:

<input asp-for="Name" />

4. How do I handle validation in ASP.NET Core forms?

Answer:
ASP.NET Core includes built-in validation using Data Annotations. You can use annotations like [Required], [StringLength], and [EmailAddress] in your model class:

public class RegisterViewModel
{
    [Required(ErrorMessage = "Name is required.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Email is required.")]
    [EmailAddress(ErrorMessage = "Invalid Email Address.")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password is required.")]
    [StringLength(100, ErrorMessage = "Password must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
    public string Password { get; set; }
}

In your Razor view, use asp-validation-for to display validation messages:

<span asp-validation-for="Name"></span>

5. How do I use client-side validation in ASP.NET Core?

Answer:
Client-side validation is achieved by including the necessary JavaScript libraries and enabling unobtrusive validation in your project. Add the following JavaScript references in your _Layout.cshtml or directly on your page:

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation/1.17.0/jquery.validate.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/mvc/5.2.3/jquery.validate.unobtrusive.min.js"></script>

Ensure the following tag has been added to your project’s _ValidationScriptsPartial.cshtml or directly in your page:

<partial name="_ValidationScriptsPartial" />

6. How do I create a dropdown list in a Razor form?

Answer:
To create a dropdown list, use the asp-for and asp-items attributes with the <select> element. You can generate asp-items from an IEnumerable<SelectListItem> in your controller:

public class HomeController : Controller
{
    public IActionResult Register()
    {
        List<SelectListItem> roles = new List<SelectListItem>
        {
            new SelectListItem {Text = "Admin", Value = "Admin"},
            new SelectListItem {Text = "User", Value = "User"}
        };

        ViewBag.Roles = roles;
        return View();
    }

    [HttpPost]
    public IActionResult Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
             // process data
        }
        return View(model);
    }
}

In your Razor view, bind the dropdown to the asp-items using the viewbag:

<select asp-for="Role" asp-items="ViewBag.Roles">
</select>

7. How do you handle file uploads in a Razor form?

Answer:
Handling file uploads involves modifying the form element to include the enctype="multipart/form-data" attribute and adding an input element with the type file:

<form asp-controller="Home" asp-action="Upload" method="post" enctype="multipart/form-data">
    <div>
        <label asp-for="File"></label>
        <input asp-for="File" type="file" />
    </div>
    <button type="submit">Upload</button>
</form>

In your controller, add a method to handle the file submission:

public class HomeController : Controller
{
    [HttpPost]
    public IActionResult Upload(IFormFile file)
    {
        if (file != null && file.Length > 0)
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", file.FileName);
            using (var stream = new FileStream(path, FileMode.Create))
            {
                file.CopyTo(stream);
            }
        }
        return RedirectToAction("Success");
    }
}

8. How can you handle multiple file uploads in ASP.NET Core?

Answer:
To handle multiple file uploads, use the multiple attribute on the <input> element and change the parameter type of the controller action to IEnumerable<IFormFile>:

<form asp-controller="Home" asp-action="UploadMultiple" method="post" enctype="multipart/form-data">
    <div>
        <label asp-for="Files"></label>
        <input asp-for="Files" type="file" multiple />
    </div>
    <button type="submit">Upload</button>
</form>

In your controller, update the action method to accept IEnumerable<IFormFile>:

public class HomeController : Controller
{
    [HttpPost]
    public IActionResult UploadMultiple(IEnumerable<IFormFile> files)
    {
        foreach (var file in files)
        {
            if (file != null && file.Length > 0)
            {
                var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/uploads", file.FileName);
                using (var stream = new FileStream(path, FileMode.Create))
                {
                    file.CopyTo(stream);
                }
            }
        }
        return RedirectToAction("Success");
    }
}

9. How do I customize the appearance of forms in ASP.NET Core with Razor?

Answer:
To customize the appearance of forms, you can use CSS stylesheets or Bootstrap classes. Razor does not limit form styling; you can apply any HTML and CSS you need:

<form asp-controller="Home" asp-action="Register" method="post" class="form-horizontal">
    <div class="form-group">
        <label asp-for="Name" class="col-sm-2 control-label"></label>
        <div class="col-sm-10">
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Email" class="col-sm-2 control-label"></label>
        <div class="col-sm-10">
            <input asp-for="Email" class="form-control" />
            <span asp-validation-for="Email" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-primary">Register</button>
        </div>
    </div>
</form>

Ensure you include Bootstrap or any other CSS framework to apply styles.

10. What are some best practices for working with forms in ASP.NET Core?

Answer:

  • Use Model Binding: Leverage model binding to map form data to model objects automatically.
  • Validate Data: Use Data Annotations to enforce validation rules on the server side.
  • Provide Feedback: Ensure form controls display validation errors and success messages.
  • Use Bootstrap: Incorporate Bootstrap or other CSS frameworks to improve form appearance.
  • Handle Errors Gracefully: Implement error handling to manage unexpected issues without crashing the application.
  • Optimize Performance: Minimize the use of inline scripts and leverage caching for static resources.
  • Follow Security Best Practices: Validate input data to prevent XSS and CSRF attacks.
  • Organize Code: Keep your views clean and maintainable by using partial views or components.

You May Like This Related .NET Topic

Login to post a comment.