2

最近,我开始将FubuMVC 项目从 2010 年 5 月/6 月之前的 FubuMVC 框架版本更新到最新版本。

我遇到的最大障碍之一是如何配置 FubuControls 和它们使用的显示模型,以便我可以在Site.Master页面中呈现这些控件。FubuException我无法解决的一个错误消息是:

FubuMVC Error 2102:  
Unknown input type ResourceDisplay

从第 69 行 的方法FindUniqueByInputType中抛出。FubuMVC.Core.Registration.Querying.ChainResolver

这是我的 Web 项目的 Global.asax.cs:

public class Global : FubuStructureMapApplication
    {
        protected override void InitializeStructureMap(IInitializationExpression ex)
        {
            Bootstrapper.ScanAndRegisterTypesForStructureMap(ex, new List<Registry>
                        {
                            new WebAppWebRegistry(),
                            new AppSettingProviderRegistry()
                        });
            setup_service_locator();
        }


        private static void setup_service_locator()
        {
            ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container));
        }

        public override FubuRegistry GetMyRegistry()
        {
            return new WebAppFubuRegistry();
        }
    }

这是我的FubuRegistry

public class WebAppFubuRegistry : FubuRegistry
    {
        public WebAppFubuRegistry()
        {
            IncludeDiagnostics(true);

            Services(x => x.SetServiceIfNone<IWebAppSecurityContext, WebAppSecurityContext>());

            Applies.ToThisAssembly()
                .ToAssemblyContainingType<HomeController>();


            Actions
                .IncludeTypesNamed(x => x.EndsWith("Controller"));

            Routes
                .UrlPolicy<WebAppUrlPolicy>()
                .IgnoreControllerNamespaceEntirely()
                .ConstrainToHttpMethod(action => action.Method.Name.StartsWith("Perform"), "POST");


            Views
                .TryToAttach(x=>
                {
                    x.by<ViewAndActionInDifferentFolders>();
                    x.by_ViewModel_and_Namespace_and_MethodName();
                    x.by_ViewModel_and_Namespace();
                    x.by_ViewModel();
                });

            /* Irrelevant behaviors are added to configuration here */


            RegisterPartials(x => x.For<ResourceDisplay>().Use<ResourceTracker>());
            //this.UseDefaultHtmlConventions();

            //HomeIs<HomeController>(x => x.Index());
        }
    }

更多信息和更新:

我发现的部分问题是,当我更新项目时,我改变了:

public class SiteMasterView : FubuMasterPage<EmptyModel>, IFubuPage<EmptyModel>{ }

public class SiteMasterView : FubuMasterPage

这意味着扩展功能RenderPartial<TViewModel>(this IFubuPage<TViewModel> viewPage)不再可以从SiteMasterView.

这是旧的和无效的RenderPartial<TViewModel>Call in Site.Master

<%= this.RenderPartial().Using<ResourceTracker>().For(Get<UserResources>().Resources)%>

所以,我认为此时我考虑尝试创建自己的 RenderPartial 扩展函数,该函数可以使用FubuMasterPage(而不仅仅是使用IFubuPage<EmptyModel>)。但我想我不妨更新我对 FubuFramework 的使用并使用void Partial<TInputModel>(this IFubuPage page) where TInputModel : class;扩展功能而不是旧的更冗长的版本。

新的召唤:

<% this.Partial<ResourceDisplay>(); %>

那时我开始ChainResolver遇到. 我还尝试在我的. 但是我没有运气通过. IFubuCommandResourceDisplayFubuRegistryChainResolver


向 FubuFramework 注册 FubuControls 及其视图模型的首选方法是什么?

如何解决上述错误?

4

1 回答 1

2

标记,

第一:我认为您正在寻找的是RenderPartialFor<TViewModel>. 这应该仍然有效,即使在母版页上也是如此。

第二:让我解决 和 之间的RenderPartial*混淆Partial

这是一个已知问题,会给人们带来很多困惑。RenderPartial 与 Partial 完全不同。我知道这很混乱,我很抱歉。我们计划在 FubuMVC 1.0 之前尽快修复这个问题。

RenderPartial 不执行行为链/动作。它与 UserControls 在 ASP.NET WebForms 中的工作方式非常相似。这是 UserControl 的简单呈现。

然而,Partial 对行为链/动作进行“部分调用”。这允许您在当前操作的上下文中调用不同的操作。由于是部分调用,因此并非所有行为都被执行。例如,如果您有一个 TransactionalBehavior 在 HTTP 请求的整个生命周期内管理 DB 事务,然后您对行为链执行了 Partial() 调用,则它不会产生新的 DB 事务。

对行为进行编码时知道它们决定是否适合在部分调用期间执行。

因此,您需要决定是否需要使用简单的内容RenderPartial(如简单的页眉/页脚或可重用的静态 HTML 块),或者是否需要在操作中执行一些逻辑以生成绑定到局部视图的模型,使用Partial方法。

在 的情况下Partial,它仍然使用 ASPX 作为其视图,除了 ASPX 不应该有完整的 HTML(例如,没有 begin <html> 标记或 body 标记),因为它总是会被加载到较大 HTML 的中间另一个视图的文档。部分 ASPX 通常不应使用母版页等。

任何动作都可以Partial通过其输入模型或反映其 ControllerType.ActionMethod 的 lamda 来调用并由其标识。但是,我建议您不要使用 执行任何旧操作Partial,而应使用旨在部分调用的操作。

默认情况下,所有操作都将通过 FubuMVC 接收路由。对于部分操作,您可能不希望它们是可路由的(即它们只能在服务器端的另一个操作的上下文中调用)。要指定这一点,您需要应用约定让 Fubu 知道不要路由这些操作。默认情况下,FubuMVC 有一个内置的约定,不使用该[FubuPartial]属性路由任何操作。如果您不想使用,则不必使用此约定,但它很方便,因为它是为您自动内置的。

您可能希望部分操作具有路由的一个原因是,如果您想使用 jQuery $.load() AJAX 方法从 Web 浏览器在服务器上加载部分 HTML 内容(即页面上的某些更改并且您想要从服务器刷新一些内容而不重新加载整个页面/屏幕)。

于 2011-03-04T21:08:29.973 回答