2011-10-04 42 views
1

假設我們有一個工廠用於返回包含選擇特定邏輯的邏輯部分。我想一些人委派負責一個工廠,然後寫控制器內整齊碼:在工廠內部創建局部視圖

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

有什麼辦法可以實現它嗎?

回答

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 new PartialViewResult(){ ViewName = "_DataFieldQueryItemPartial" }; 

更換

return PartialView("_DataFieldQueryItemPartial"); 

在你的例子就可以了。

+0

最後一行真的有把戲 –

0

調用PartialView實際上只是返回PartialViewResult對象。您可以在任何地方真正創建新的PartialViewResult。因此,您可以在您的基礎控制器上創建自己的快捷方法FactoryPartialView(),該方法使用您的工廠替代「新」運算符來創建PartialViewResult。

0

'PartialViewResult'類繼承'ViewResultBase'類。 'ViewResultBase'類需要屬性和方法來設置新的視圖類型。在聲明對象類型時要小心。