Я работаю над приложением 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?