MVC3 Dropdown прекрасно заполняется даже при обратной передаче ошибок, но есть предложения о том, как сделать это эффективным - без ошибок - PullRequest
0 голосов
/ 23 февраля 2011

Я не могу опубликовать свой код в данный момент, так как я нахожусь в дороге и вне офиса. Вот мой код значительно упрощен. Я не думаю, что у меня есть проблема с синтаксисом как таковая - я думаю, что мне нужно пояснение или указатель.

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.

1 Ответ

0 голосов
/ 23 февраля 2011

Вы можете использовать SessionState, чтобы избежать отключения базы данных для повторного заполнения раскрывающегося списка. Заполните SessionState в первом запросе GET, а затем загрузите его, когда вам необходимо заполнить раскрывающийся список (при ошибке) в POST. Однако будьте осторожны с размером коллекции, которую вы храните в SessionState - вам, возможно, будет лучше пойти в базу данных для повторной загрузки данных.

...