Вот простая модель вида, которую я использую:
public class ViewModel
{
public Order Order { get; set; }
// returned from page - also can be pre-selected
public string[] SelectedProducts { get; set; }
// data for page to render available products to select from
public IList<ProductViewModel> AvailableProducts { get; set; }
}
public ActionResult Edit(Order order)
{
return View(new ViewModel { Order = order, SelectedProducts = new string[0], AvailableProducts = repository.GetAvailable() });
}
(обратите внимание, что Order автоматически связывается с пользовательским связывателем модели в POST)
Теперь я возвращаю View (новый ViewModel (...)), и он работает. Страница GET / Edit отображает доступные продукты, пользователь выбирает их, а затем отправляет выбранные POST / Edit действия, выбранные из SelectedProducts.
Проблема в том, что пользовательский ввод недопустим - мне нужно повторно отобразить страницу, не касаясь введенных пользовательских данных, но при этом предоставить доступный продукт. Просто return View (data) не будет работать, потому что AvailableProducts не является частью предоставленных данных и имеет значение null.
Вопрос: как мне решить проблему? Я могу сделать
public ActionResult(ViewModel data)
{
if (!ModelState.IsValid)
{
data.AvailableProducts = repository.GetAvailable();
return View(data);
}
}
но это немного многословно и подвержено ошибкам, так как неясно, какие свойства передаются и что нужно переустанавливать. Есть ли лучший способ?
Например, у меня может быть ViewModel, получающий сами данные (например, с помощью ServiceLocator), но это не очень хорошо, поскольку контроллер должен подготовить данные.