0

只是尝试使用 NuGet 中的 MVCWizard.Wizard 作为多页向导 UI 的一部分。

我有一些“父”模型类,以“子”类为小节,例如

public class MainModel
{
public virtual int MainModelId { get; set; }
public virtual PersonalDetails CustomerPersonalDetails { get; set; }
public virtual AddressDetails CustomerAddressDetails{ get; set; }
public virtual FinanceDetails CustomerFinanceDetails{ get; set; }
}

通过反复试验,我发现要使用 MVCWizard.Wizard,我必须为要显示的页面的每个子部分创建一个“WizardManager”(因此,一个 WizardManager、控制器、部分视图等用于 CustomerPersonalDetails,一个用于CustomerAddressDetails 等等..)

..到目前为止,一切都很好..

为每个小节创建控制器继承自 WizardController T,其中 T 是模型。我想做的是对每个小节用来接受 MainModel 整体的控制器进行编码,然后根据需要从那里将 MainModel.Child 传递给每个局部视图(MVCWizard.Wizard 似乎需要的方式)

这样做,一切都可以编译,但在使用中,在向导页面(部分视图)之间来回导航,base.Wizard().WizardModel 中的数据正在被清除。

我发现,为了让它在来回导航时保留 Base.Wizard().WizardModel 中的数据,我必须为每个 WizardManager 显式指定子类类型。

所以..(控制器)

public MyController : WizardManager < MainModel >...
public PartialViewResult SubsectionPage1(MainModel mdl)..

(看法)

@model MainModel
CustName:  @Html.TextBoxFor(m => m.CustomerPersonalDetails.CustName) 

..看起来它可以工作,但没有保留数据..但是..

(控制器)

public MyController : WizardManager< PersonalDetails >...
public PartialViewResult SubsectionPage1(PersonalDetails details)..

(看法)

@model PersonalDetails
CustName:  @Html.TextBoxFor(m => m.CustName) 

工作得很好......为什么 MVCWizard.Wizard 似乎无法处理包含一个或多个“子”类型的“复杂”模型,我是否遗漏了什么?最终我可以对其进行编码,因此我将这些较小的模型传递给 WizardManager,然后将它们组合并映射到我的域模型,然后再持久化到数据存储区,但我将不胜感激。

* 编辑 *

好的,我已经挖掘了更多,初始模型绑定在大多数正常情况下应该可以正常工作。但是在使用 MVCWizard.Wizard 时,问题似乎出在 MVCWizard.Wizard 的“EnableSimpleMerge”功能上。它在页面导航期间使用,合并函数如何使用反射来发现模型中的属性似乎存在问题。从我最初的外观来看,它似乎没有被编码为在更复杂的模型结构中递归和“发现”子对象。

private void Merge(T wizard, T model)
        {
            foreach (PropertyInfo info in model.GetType().GetProperties())
            {
                object obj2 = info.GetGetMethod().Invoke(model, null);
                if (obj2 != null)
                {
                    wizard.GetType().GetProperty(info.Name).GetSetMethod().Invoke(wizard, new object[] { obj2 });
                }
            }
            foreach (FieldInfo info3 in model.GetType().GetFields())
            {
                object obj3 = info3.GetValue(model);
                if (obj3 != null)
                {
                    wizard.GetType().GetField(info3.Name).SetValue(wizard, obj3);
                }
            }
        }
4

1 回答 1

0

(见上面的评论:)

需要使用深度属性反射编写更详细的 Merge 方法

于 2012-09-12T14:38:28.787 回答