2010-05-13 5 views
1

Я тестирую несколько концепций в многопроцессах ASP.NET MVC (Style Wizards) с небольшим приложением, которое позволяет мне записывать организации в базу данных.Как передать значение из DropDownList в свойство объекта сериализованной модели

Чтобы сделать вещи проще, у меня относится к классу OrganizationFormModelView, который содержит объект класса организации и свойство ParentOrgList типа SelectList. Единственная цель свойства selectList - использовать DropDownList.

Я также сериализую OrganizationFormModelView, чтобы получить эффект Мастеров мультистафов.

В мой первый взгляд (или первый шаг), я использую помощника DropDownList, чтобы присвоить значение одной из имущества Организации под названием ParentOrganization, который черпает данные из ParentOrgList.

... 
<% = Html.DropDownList("Organization.ParentOrganization", Model.ParentOrgList)%> 
... 

При первой загрузке страницы я могу сделать выбор. И мой выбор отражен в моем объекте модели по шагам мастера (см. Visual studio в режиме отладки).

Но, когда какое-то время я перенаправлены обратно на первый взгляд (первая ступень), я получаю следующее сообщение об ошибке:

«Элемент ViewData с ключом„Organization.ParentOrganization“имеет type 'System.String', но должен иметь тип «IEnumerable».

Спасибо за помощь

+0

Можете ли вы показать нам еще несколько ваших взглядов и кода контроллера? Мне кажется, что выбранное значение DropDownList каким-то образом сохраняется в коллекции ViewData. –

+0

@Nathan Taylor: вы правы. Думаю, мне нужно более внимательно посмотреть на ViewData и вернуться сюда. – Richard77

ответ

2

После тщательного рассмотрения моего кода, теперь я понимаю, что происходит. OrganizationFormModelView - это класс, который сериализуется, и вот его определение.

[Serializable] 
public class OrganizationFormViewModel 
{ 
    public Organization Organization { get; set; } 
    [NonSerialized] 
    public SelectList ParentOrgList = null; 
    public OrganizationFormViewModel(Organization organization, SelectList cList) 
    { 
     Organization = organization ?? new Organization(); 
     ParentOrgList = pList; 
    } 
} 

Из этого я сделал вывод, что, после каждого процесса сериализации ParentOrgList устанавливается в нуль, так что мне нужно найти способ переназначения значения к нему. Итак, ниже того, что я сделал:

public ActionResult CreateOrganization(string nextButton) 
    { 
     //Omitted for brievety 
     if (formViewModel.ParentOrgList == null) 
      formViewModel.ParentOrgList = repository.CommuneList; 
     //Omitted for brievety 
    } 

Я также изменил вид, так что, даже если значение ParentOrgList непрерывно переназначены, но DropDownList сохраняет выбор пользователя. Таким образом, я выбираю перегрузку Helper со значением по умолчанию.

... 
<% = Html.DropDownList("Organization.ParentOrganization", Model.ParentOrgList, 
    Model.Organization.ParentOrganization)%> 
... 

Теперь все работает отлично.

Однако, если кто-то знает, как действовать по-другому с бизнесом Serialization, было бы полезно поделиться.

Спасибо

Смежные вопросы