首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVCWizard.Wizard -使用复杂模型

MVCWizard.Wizard -使用复杂模型
EN

Stack Overflow用户
提问于 2012-08-13 15:47:07
回答 1查看 513关注 0票数 0

只是尝试使用来自NuGet的NuGet作为多页向导UI的一部分。

我有一些“父”模型类,其中“子”类作为子类。

代码语言:javascript
运行
复制
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“(比如CustomerPersonalDetails的一个WizardManager、控制器、部分视图等,CustomerAddressDetails等等)。

..so现在还不错..。

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

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

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

所以..。(控权人)

代码语言:javascript
运行
复制
public MyController : WizardManager < MainModel >...
public PartialViewResult SubsectionPage1(MainModel mdl)..

(见图)

代码语言:javascript
运行
复制
@model MainModel
CustName:  @Html.TextBoxFor(m => m.CustomerPersonalDetails.CustName) 

..looks喜欢它的工作,但是数据不被保留。但是..。

(控权人)

代码语言:javascript
运行
复制
public MyController : WizardManager< PersonalDetails >...
public PartialViewResult SubsectionPage1(PersonalDetails details)..

(见图)

代码语言:javascript
运行
复制
@model PersonalDetails
CustName:  @Html.TextBoxFor(m => m.CustName) 

效果很好..。为什么MVCWizard.Wizard似乎不能处理包含一个或多个“子”类型的“复杂”模型?最终,我可以对其进行编码,以便将这些较小的模型传递给WizardManager,然后在持久化数据存储之前将它们组合起来并映射到我的域模型中,但是我很感谢您的解释。

*编辑*

好的,我已经做了更多的研究,在大多数正常情况下,初始的模型绑定应该工作得很好。但在使用MVCWizard.Wizard时,问题似乎与MVCWizard.Wizard的"EnableSimpleMerge“特性有关。它在页面导航期间使用,并且该合并函数如何使用反射来发现模型中的属性似乎存在问题。从我的初步看,它似乎没有编码通过和“发现”一个更复杂的模型结构中的子对象。

代码语言:javascript
运行
复制
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);
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-12 14:38:28

(见上文评论:)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11937776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档