在工厂内创建局部视图

时间:2011-10-04 09:31:06

标签: c# .net asp.net-mvc

假设我们有一个工厂来返回包含选择某个逻辑的逻辑的部分。我希望有人将这个职责委托给工厂,然后在控制器内编写一个简洁的代码:

    [HttpGet]
    public PartialViewResult GetQueryItemForCategory(string categoryName, bool campaignSelected)
    {
        return QueryItemBuilderFactory.BuildPartial(categoryName, campaignSelected);
    } 

但我真的无法在该工厂内调用PartialView()方法。

public static class QueryItemBuilderFactory
{
    private static Dictionary<string, Func<bool, PartialViewResult>> _builderActions =
        new Dictionary<string, Func<bool, PartialViewResult>>();
    static QueryItemBuilderFactory()
    {
        _builderActions.Add("Data Field", campaignSelected =>
                                            {
                                                return  PartialView("_DataFieldQueryItemPartial");
                                            });
    }

    public static PartialViewResult BuildPartial(string categoryName, bool campaignSelected)
    {
        return _builderActions[categoryName](campaignSelected);
    }
}

有没有办法实现它?

3 个答案:

答案 0 :(得分:2)

受保护的PartialView方法在基础Controller类中定义:

public abstract class Controller : ControllerBase, IActionFilter,
    IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter
{
    ...

    protected internal PartialViewResult PartialView()
    {
        ...
    }

    protected internal PartialViewResult PartialView(object model)
    {
        ...
    }

    protected internal PartialViewResult PartialView(string viewName)
    {
        ...
    }

    ...
}

因此继承此Controller类使您可以使用此方法,而在其他情况下则不可用。 但是,您可以看到PartialView方法返回PartialViewResult个对象,因此替换

return PartialView("_DataFieldQueryItemPartial");

的示例中

return new PartialViewResult(){ ViewName = "_DataFieldQueryItemPartial" };

会做到这一点。

答案 1 :(得分:1)

&#39; PartialViewResult&#39; class继承&#39; ViewResultBase&#39;类。 &#39; ViewResultBase&#39; class具有设置新视图类型所需的属性和方法。声明对象类型时要小心。

答案 2 :(得分:0)

调用PartialView实际上只返回PartialViewResult对象。您可以在任何地方创建新的PartialViewResult。因此,您可以在基本控制器上创建自己的快捷方法FactoryPartialView(),使用您的工厂代替“new”运算符来创建PartialViewResult。