MVC2 DataAnnotations на ViewModel - не понимаю, как использовать его с шаблоном MVVM - PullRequest
3 голосов
/ 09 июня 2010

У меня есть приложение MVC2, которое использует шаблон MVVM.Я пытаюсь использовать аннотации данных для проверки ввода формы.

В моем ThingsController у меня есть два метода:

    [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();
        }
    }

Мое представление Details.aspx строго типизировано для ThingsViewModel:

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

ViewModel - это класс, состоящий изIList возвращенных объектов Thing и строки Query (которая отправляется в форме) и имеет аннотацию Обязательные данные:

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

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

Когда я запускаю это, и нажимаю кнопку отправки на форме, не вводязначение Я получаю YSOD со следующей ошибкой:

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]'.

Как я могу получить аннотации данных для работы с ViewModel?Я не вижу, что мне не хватает или где я иду не так - виртуальная машина работала просто отлично, прежде чем я начал дурачиться с проверкой.

Ответы [ 4 ]

1 голос
/ 16 июня 2010

Не думаю, что проблема с проверкой.

Измените эту строку;

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

на эту

tvm.Things = repository.ToList();

Я не знаючто это такое или что он делает;

new ThingRepository(q);

Он принимает строковый параметр и возвращает какой-то тип Linq IQueriable или List?Если это возвращает что-то еще, это может быть причиной проблемы.

0 голосов
/ 18 июня 2010

Я думаю, что ASP.NET MVC, возможно, пытается сопоставить ваше представление с неправильным контроллером.Когда вы возвращаете представление, вам может потребоваться указать имя файла представления, которое вы пытаетесь использовать.

возврат Просмотр ("ViewName")

0 голосов
/ 17 июня 2010

Похоже, вы могли бы просто объявить свою ThingsViewModel следующим образом:

public class ThingsViewModel: IEnumerable<Thing>

и затем реализовать соответствующий интерфейс для доступа к списку вещей.

0 голосов
/ 16 июня 2010

У вас включена проверка на стороне клиента? Это может быть даже быстрое хакерское исправление, но в отношении сообщения об ошибке - сложно сказать без дополнительной информации. Не могли бы вы опубликовать свой вид и визуализированный HTML? Как выглядит ваш маршрут для деталей? Если вы установили точку останова в начале метода Details, ударится ли она при нажатии на кнопку отправки?

...