Как мне настроить Fubu для просмотра без контроллера? - PullRequest
2 голосов
/ 05 марта 2011

У меня есть действие Index на контроллере, который ничего не делает.

public EmptyModel Index()
{
     return null;
}

В представлении Index просто отображается некоторый html, а jJuery-управляемый ajax и MasterPage выполняют всю тяжелую работуна этой конкретной странице.Когда я удаляю эту функцию действия из ее контроллера, представление aspx больше не будет отображаться.


Дополнительная информация и обновление:

После внесения изменений, упомянутых в ответе Чада, URL-адрес, который использовалчтобы вернуть индексное представление сейчас, вместо этого возвращается 404. Эта проблема может существовать, потому что большая часть структуры папок представлений выполнена в раннем стиле Fubu Framework (с View_Page_Type_Declarations.cs и без кода), вместо того, чтобы использовать более интуитивно понятный иболее новые соглашения о папках по умолчанию.Но возможно мой анализ отключен.

Вот мой FubuRegistry:

public WebAppFubuRegistry()
{
    IncludeDiagnostics(true);

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

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


    Actions
        .IncludeClassesSuffixedWithController();


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


    Views
        .TryToAttach(x=> x.by<ViewAndActionInDifferentFolders>())
        .TryToAttachWithDefaultConventions()
        .RegisterActionLessViews(WebFormViewFacility.IsWebFormView,
               chain => chain.PartialOnly());

    /*Behavior Code */
}

WebAppUrlPolicy:

public class WebAppUrlPolicy : IUrlPolicy
    {
        public bool Matches(ActionCall call, IConfigurationObserver log)
        {
            return true;
        }

        public IRouteDefinition Build(ActionCall call)
        {
            if(call.IsForHomeController())
                return new RouteDefinition("home");

            if(call.IsAnIndexCall())
                return new RouteDefinition(call.ControllerPrefix());

            var otherRoute = new RouteDefinition(call.ToControllerActionRoute());

            return otherRoute;
        }
    }

ViewAndActionInDifferentFolders:

public class ViewAndActionInDifferentFolders : IViewsForActionFilter
    {
        public IEnumerable<IViewToken> Apply(ActionCall call, ViewBag views)
        {
            if (call.IsForHomeController())
            {
                var viewTokens = views.ViewsFor(call.OutputType()).Where(x => x.Name == "HomeIndexView");
                return new[] { new WebAppViewToken(call, viewTokens, "home") };
            }
            if (call.IsJsonCall())
            {
                return new List<IViewToken>();
            }
            return CreateSingleTokenList(call, views);
        }
        private static IEnumerable<WebAppViewToken> CreateSingleTokenList(ActionCall call, ViewBag views)
        {
            return new[] { new WebAppViewToken(call, views.ViewsFor(call.OutputType())) };
        }
    }

Как перенастроить Fubu, чтобы я мог использовать представление без действия?

Какие изменения необходимо внести, чтобы удалить указанную выше функцию действия и при этом сохранить ту же функциональность?

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

В вашей FubuRegistry, в разделе «Представления» добавьте:

.RegisterActionLessViews(WebFormViewFacility.IsWebFormView, chain => chain.PartialOnly());

Например, весь раздел представлений может выглядеть так:

        Views
            .TryToAttachWithDefaultConventions()
            .RegisterActionLessViews(
                                        WebFormViewFacility.IsWebFormView, 
                                        chain => chain.PartialOnly());

Обратите внимание, что вы можете использовать ASPX и ASCX для просмотра без головы. Если вам нужны только файлы ASCX, вы можете использовать WebFormViewFacility.IsWebFormControl.

2 голосов
/ 14 июня 2011

у меня работает:

Views.RegisterActionLessViews(type => type.Name == "StaticView", 
       chain => chain.Route = new RouteDefinition("StaticView"));
...