MVC2 DataAnnotations on ViewModel - Don't understand how to use it with MVVM template

I have an MVC2 application that uses the MVVM pattern. I am trying to use Data Annotations to validate form input.

In my ThingsController, I have two methods:

    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Details(ThingsViewModel tvm)
    {
    if (!ModelState.IsValid) return View(tvm);

        try
        {
Query q = new Query(tvm.Query);
            ThingRepository repository = new ThingRepository(q);

tvm.Things = repository.All();                
return View(tvm);
        }
        catch (Exception)
        {
            return View();
        }
    }

My Details.aspx view is strongly typed for ThingsViewModel:

<%@ Page Title="" 
         Language="C#" 
         MasterPageFile="~/Views/Shared/Site.Master"        
         Inherits="System.Web.Mvc.ViewPage<Config.Web.Models.ThingsViewModel>" %>

ViewModel is a class consisting of an IList of returned Thing objects and a Query string (which is presented on the form) and has an annotation of the required data:

public class ThingsViewModel
{
    public IList<Thing> Things{ get; set; }

    [Required(ErrorMessage="You must enter a query")]
    public string Query { get; set; }
}

When I ran this and clicked the submit button on the form without entering a value, I get YSOD with the following error:

The model item passed into the dictionary is of type 
'Config.Web.Models.ThingsViewModel', but this dictionary 
requires a model item of type 
System.Collections.Generic.IEnumerable`1[Config.Domain.Entities.Thing]'.

How can I get data annotations to work with ViewModel? I don’t see what I am missing, or where I am wrong - the virtual machine worked fine before I started checking.

+3
4

, .

;

tvm.Things = repository.All(); //Is this the Linq extension method 'All()'?

tvm.Things = repository.ToList();

, ,

new ThingRepository(q);

- Linq IQueriable List? - , .

+1

? -, - . View Html? ? "", ?

0

, ThingsViewModel :

public class ThingsViewModel: IEnumerable<Thing>

Things.

0

, ASP.NET MVC . , , .

return View ("ViewName")

0
source

Source: https://habr.com/ru/post/1749097/


All Articles