Как передать значение из DropDownList в свойство объекта сериализованной модели - PullRequest
1 голос
/ 13 мая 2010

Я тестирую некоторые концепции в многоступенчатых 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 »."

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

1 Ответ

2 голосов
/ 14 мая 2010

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

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

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

Спасибо

...