我正在使用一个小应用程序测试ASP.NET MVC多步骤(样式向导)中的一些概念,这些概念允许我在数据库中记录组织。
为了简化操作,我有一个类 OrganizationFormModelView ,它包含类组织的对象和一个名为 ParentOrgList 的SelectList类型的属性。 dropList属性的唯一目的是由DropDownList使用。
我还序列化 OrganizationFormModelView 以获取多步骤向导效果。
在我的第一个视图(或第一步)中,我使用下拉列表帮助程序为一个名为 ParentOrganization 的组织属性分配一个值,该属性从 ParentOrgList中提取数据。
...
<% = Html.DropDownList("Organization.ParentOrganization", Model.ParentOrgList)%>
...
第一次加载页面时,我可以做出选择。而且,我的选择反映在我的对象模型以及向导的所有步骤中(请参阅调试模式下的Visual Studio)。
但是,当我被重定向回第一个视图(第一步)时,我收到以下错误消息:
“具有键'Organization.ParentOrganization'的ViewData项的类型为'System.String',但需要是'IEnumerable'类型。”
感谢您的帮助
答案 0 :(得分: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 被设置为null,因此我需要找到一种为其重新赋值的方法。所以,下面是我做的:
public ActionResult CreateOrganization(string nextButton)
{
//Omitted for brievety
if (formViewModel.ParentOrgList == null)
formViewModel.ParentOrgList = repository.CommuneList;
//Omitted for brievety
}
我也修改了View,这样即使连续重新分配ParentOrgList的值,DropDownList也会保留用户的选择。所以,我选择了一个默认值的Helper重载。
...
<% = Html.DropDownList("Organization.ParentOrganization", Model.ParentOrgList,
Model.Organization.ParentOrganization)%>
...
现在,一切都运转良好。
但是,如果有人知道如何以序列化业务的方式进行不同的操作,那么分享会很有帮助。
由于