'Global model in controller ASP.NET Core MVC 6

I have Home / Index where show list of Current Tasks, Completed Tasks and form for creating new task.

I created HomeIndexViewModel for pass models (Completed tasks, Current Tasks and TaskCreateViewModel for form) to Index View and there call (@Model.CompletedTasks, @Model.CurrentTasks and @Model.FormCreate)

But in CreatedTaskViewModel I want to get information about validation errors and render them in View. I init in Controller HomeIndexViewModel and get access from Index(Action) and Create(Action).

Approach worked, but I am not sure what it's good idea.

public class HomeIndexViewModel
{
    public List<TaskModel> CompletedTasks { get; set; } = new List<TaskModel>();
    public List<TaskModel> CurrentTasks { get; set; } = new List<TaskModel>();
    public CreateTaskViewModel FormCreate { get; set; } = new CreateTaskViewModel();
}


public class HomeController : Controller
{
    private readonly ITaskRepository _taskRepository;
    private HomeIndexViewModel homeIndexViewModel;

    public HomeController(IConfiguration configuration)
    {
        _taskRepository = new TaskRepository(configuration.GetConnectionString("AppDB"));
        homeIndexViewModel = new HomeIndexViewModel() 
        {
            CompletedTasks = _taskRepository.GetList("completed");
            CurrentTasks = _taskRepository.GetList("current");
        };

    public ActionResult Index()
    {
        return View(homeIndexViewModel);
    }

    public ActionResult Create(CreateTaskViewModel task)
    {
        if (ModelState.IsValid)
        {
            _taskRepository.Create(task);
        }

        return View(nameof(Index), homeIndexViewModel);
    }


Solution 1:[1]

I think you could write a service and inject it to your controller:

public interface ISomeService

    {
        public HomeIndexViewModel GetHomeIndexViewModel(IConfiguration configuration, ITaskRepository taskRepository)
        {
            //some codes
            HomeIndexViewModel homeIndexView = new HomeIndexViewModel() 
            {
                //some codes
            };
            return homeIndexView;
        }
    }

    public class SomeService : ISomeService
    {

        public HomeIndexViewModel GetHomeIndexViewModel(IConfiguration configuration, ITaskRepository taskRepository)
        {
           //some codes
            HomeIndexViewModel homeIndexView = new HomeIndexViewModel()
            {
                //some codes
            };
            return homeIndexView;
        }
    }

In your Startup Class?

public void ConfigureServices(IServiceCollection services)
{
   .....
   services.AddTransient<ISomeService, SomeService>();
   .....
}

In your Controller?

    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
            private readonly ISomeService _someService;
            private readonly ITaskRepository _taskRepository;
            private readonly IConfiguration _configuration;
    
            public HomeController(ILogger<HomeController> logger, ISomeService someService, ITaskRepository taskRepository, IConfiguration configuration)
            {
                _logger = logger;
                _someService = someService;
                _taskRepository = taskRepository;
                _configuration = configuration;
            }
    
            public IActionResult Index()
            {
                var homeindexviewmodel = _someService.GetHomeIndexViewModel(_configuration,_taskRepository);
                //you could get the homeindexviewmodel in other controllers with the same method
                return View();
            }
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ruikai Feng