View Components in Asp.net Core MVC

View Components in Asp.net Core MVC
View Components are self-contained, reusable UI building blocks in ASP.NET Core MVC. They are designed to encapsulate rendering logic that’s more complex than what you’d typically put in a partial view but doesn’t warrant the complexity of a full controller and view.
 
Best Practices
Naming: View Component classes should end with the suffix ViewComponent (e.g., ProductListViewComponent).
Structure: Place View Components in the ViewComponents folder. The associated view file should be placed in Views/Shared/Components/{ViewComponent Name}/{View Name}.cshtml.
Data: Pass data to the View Component using a strongly typed model or view model.
Asynchronous: Use asynchronous methods (InvokeAsync) to avoid blocking threads when performing data access or other I/O operations.
Simplicity: Keep the View Component’s logic focused on rendering the UI element. Avoid complex business logic within the component.
 
Things to Avoid
Overuse: Don’t use View Components for simple UI elements that can be handled by partial views.
Tight Coupling: Avoid tightly coupling View Components to specific controllers or actions. Make them reusable across different parts of your application.
Complex Logic: View Components should not be responsible for handling business logic. Instead, delegate that to your models or services.
Direct Database Access: Avoid directly accessing your database from within a View Component. Use services for data access.
 
When to Use View Components
Complex UI Elements: When a UI element requires more complex rendering logic than a simple partial view.
Data-Driven Elements: When you need to fetch data or perform some computation before rendering the UI element.
Reusable Widgets: When you want to create a reusable widget that can be used in different parts of your application.
 
Implement View Components
Create a View Component Class: Derive from ViewComponent and implement an Invoke or InvokeAsync method.
Create a View: Create a Razor view file (.cshtml) within the Views/Shared/Components/{ViewComponent Name} folder.
Invoke in Your View: Use the @await Component.InvokeAsync(“ViewComponent Name”, arguments) helper in your main view to render the View Component.
 
Code
// GridViewComponent.cs (View Component)
public class GridViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        // Data for the view component (could come from a database, service, etc.)
        PersonGridModel model = new PersonGridModel()
        {
            GridTitle = “Persons List”,
            Persons = new List<Person>()
            {
                new Person() { PersonName = “John”, JobTitle = “Manager” },
                // more people
            }
        };
 
        // ViewBag is not ideal; prefer using a strongly typed model
        ViewData[“Grid”] = model;
 
        return View(“Sample”); // This will look for the view in Views/Shared/Components/Grid/Sample.cshtml
    }
}
 
// Views/Home/Index.cshtml (Main View)
@await Component.InvokeAsync(“Grid”) // Invokes the “Grid” view component
 
// Views/Home/About.cshtml
@await Component.InvokeAsync(“Grid”)
 
<vc:grid></vc:grid> // alternative syntax (not preferred, as it is not strongly typed)
 
Explanation:
The GridViewComponent class is a view component that fetches a list of people and passes it to the “Sample” partial view along with a grid title using ViewBag.
Views/Home/Index.cshtml and Views/Home/About.cshtml invoke the Grid view component using @await Component.InvokeAsync(“Grid”) (or, less ideally, the vc:grid tag helper), rendering the person list in a grid format.
 

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply