Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC2 DataAnnotations on ViewModel - Don't understand using it with MVVM pattern

I have an MVC2 Application that uses MVVM pattern. I am trying 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 to the ThingsViewModel:

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

The ViewModel is a class consisting of a IList of returned Thing objects and the Query string (which is submitted on the form) and has the Required data annotation:

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

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

When I run this, and click the submit button on the form without entering a value I get a 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 a ViewModel? I cannot see what I'm missing or where I'm going wrong - the VM was working just fine before I started mucking around with validation.

like image 506
Scott Baker Avatar asked Nov 30 '25 04:11

Scott Baker


1 Answers

I don't think the problem is with the validation.

Change this line;

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

to this

tvm.Things = repository.ToList();

I don't know what this is or what it does;

new ThingRepository(q);

It takes a string parameter and returns some kind of Linq IQueriable or List? If that's returning something else it could be causing the problem.

like image 74
Casey Burns Avatar answered Dec 02 '25 18:12

Casey Burns



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!