Я не могу опубликовать свой код в данный момент, так как я нахожусь в дороге и вне офиса. Вот мой код значительно упрощен. Я не думаю, что у меня есть проблема с синтаксисом как таковая - я думаю, что мне нужно пояснение или указатель.
Model:
[Validaton attribute]
class Data
{
[Required]
int xx
..
}
ViewModel:
class VM
{
SelectItem Items;
int ItemID;
Data dt = new Data();
public VM
{
Items =... Load from db...
}
}
View
@Textbox xx (etc)
@DropDownFor(VM.ItemID, VM.Items
Controller
void Index
{
VM vm = new VM();
//I also default some items here works well - I get a nice form all loaded.
return View(vm);
}
[POST]
void Index(VM stuffPosted)
{
If ModelState.OK)(
{
All good. We direct to another page with Redirect To Action
}
else
{
return View(stuffPosted)
//This is the problem case where I need an efficiency
}
ПРОБЛЕМА
Форма отлично загружается с помощью метода Index. При обратной передаче, идентификатор возвращается правильно в ItemID. Если есть ошибка - ModelState отправляет обратно представление ... и все списки выбора на месте, с выборами. О, радость! НО, в методе Postback, экземпляр экземпляра VM stuffposted вызывает конструктор, и есть еще один (дорогой) вызов db .... для перезагрузки коллекций ... тогда ViewState загружает выбранные идентификаторы поверх него ...
Если я произвожу рефакторинг кода, чтобы избежать дорогой перезагрузки коллекций ... тогда я получу классическую ошибку в духе
int32 но ожидая IEnumerable и моя оригинальная форма не показывает ...
Я что-то упускаю, ясно .. как перезагрузить коллекцию из 'ViewState' (страницы) для повторного использования в ситуации ошибки, и мне не нужен вызов db.