在工厂中创建一个局部视图

本文关键字:一个 局部 视图 工厂 创建 | 更新日期: 2023-09-27 18:10:34

假设我们有一个用于返回部分的工厂,其中包含选择某个部分的逻辑。我想把这个责任委托给工厂,然后在控制器里面写一个简洁的代码:

    [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);
    }
}

有办法实现吗?

在工厂中创建一个局部视图

受保护的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" };

'PartialViewResult'类继承'ViewResultBase'类。ViewResultBase类有设置新视图类型所需的属性和方法。

调用PartialView实际上只返回PartialViewResult对象。你可以在任何地方创建新的PartialViewResult。所以,你可以在你的基本控制器上创建你自己的快捷方法FactoryPartialView(),它可以使用你的工厂代替"new"操作符来创建PartialViewResult。