Как передать значение из DropDownList в свойство сериализованного объекта модели

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

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

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

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

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

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

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

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

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


person Richard77    schedule 13.05.2010    source источник
comment
Не могли бы вы показать нам еще немного кода вашего представления и контроллера? Мне кажется, что выбранное значение вашего DropDownList каким-то образом сохраняется в коллекции ViewData.   -  person Nathan Taylor    schedule 14.05.2010
comment
@ Натан Тейлор: ты прав. Думаю, мне нужно более внимательно изучить ViewData и вернуться сюда.   -  person Richard77    schedule 14.05.2010


Ответы (1)


Внимательно изучив свой код, я понимаю, что происходит. 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 устанавливается значение null, поэтому мне нужно найти способ переназначить ему значение. Итак, вот что я сделал:

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)%>
... 

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

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

Спасибо

person Richard77    schedule 14.05.2010