Как обойти проверку при использовании viewmodels для фильтрации поиска в ASP.NET MVC (3RC2) - PullRequest
0 голосов
/ 11 января 2011

Я работаю над приложением ASP.NET MVC (используя MVC3 RC2). Скажем, у меня есть 2 объекта: продукт и категория. Категория должна иметь CategoryTitle, который обозначается через атрибуты метамодели, например:

public class CategoryModel
{
    public int CategoryID { get; set; }

    [Required("{0} is required.")]
    public int CategoryTitle { get; set; }
}

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

public class SearchModel 
{
    public CategoryModel Category { get; set; }
    public string Keyword { get; set; }
}

public class ProductController
{
    public ActionResult Search(SearchModel searchModel)
    {
        if (ModelState.IsValid)
        {
            // logic to return view with viewmodel
        }
        return HttpNotFound();
    }
}

В представлении раскрывающийся список отображается с использованием SearchModel и отправляет запросы через HTTP GET в виде /Product/Search?Keyword=my+keywords&Category.CategoryID=69. Объект SearchModel заполняется по назначению, создавая новую CategoryModel с CategoryID == 69.

Проблема в том, что ModelState.IsValid всегда возвращает false, поскольку Category.Title имеет значение null. Как правильно сделать это в ASP.NET MVC? Нужно ли прибегать к созданию другой SearchModel, у которой нет экземпляра CategoryModel?

1 Ответ

1 голос
/ 11 января 2011

Правильный способ сделать это - использовать модели представлений вместо моделей в представлениях и из них. Модели представления - это классы, которые специально адаптированы к потребностям данного представления: они содержат только свойства, необходимые для представления, и атрибуты проверки в контексте данного представления. Таким образом, вы можете иметь несколько моделей представлений для одной и той же модели. Для отображения между моделью и моделями представления вы можете использовать AutoMapper .

...