2008-12-16 79 views
4

是否有可能繼承ViewPage和ViewPage <T>?或者我必須實施兩者。目前這是我對ViewPage的看法。我是否需要重複自己,併爲ViewPage <T>做同樣的事情?繼承ViewPage

public class BaseViewPage : ViewPage 
    { 
     public bool LoggedIn 
     { 
      get 
      { 
       if (ViewContext.Controller is BaseController) 
        return ((BaseController)ViewContext.Controller).LoggedOn; 
       else 
        return false; 
      } 
     } 
    } 

回答

3

創建兩個版本:

public class BaseViewPage : ViewPage 
{ 
    // put your custom code here 
} 

public class BaseViewPage<TModel> : BaseViewPage where TModel : class 
{ 
    // code borrowed from MVC source 

    private ViewDataDictionary<TModel> _viewData; 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public new ViewDataDictionary<TModel> ViewData { 
     get { 
      if (_viewData == null) { 
       SetViewData(new ViewDataDictionary<TModel>()); 
      } 
      return _viewData; 
     } 
     set { 
      SetViewData(value); 
     } 
    } 

    protected override void SetViewData(ViewDataDictionary viewData) { 
     _viewData = new ViewDataDictionary<TModel>(viewData); 

     base.SetViewData(_viewData); 
    } 
} 

然後

public class MyCustomView : BaseViewPage 
{ 
} 

or 

public class MyCustomView : BaseViewPage<MyCustomViewData> 
{ 
} 
+0

這並不意味着我將不得不在每一個重複相同的屬性'LoggedIn'代碼。當然,我不應該重複自己。 – Schotime 2008-12-16 06:28:33

1

取決於你怎麼可能你正在做的事情想看看

ViewContext.HttpContext.Request.IsAuthenticated 

也許會救你有些時候,而不是擴大視圖頁面類。

如果還有其他數據,那麼您可能可以將擴展方法寫入其中一個提供數據的類。例如。如果LoggedIn存儲在會話中,則可以擴展上下文以在方法中爲您提供IsLoggedIn()。

編輯:

由於您的擴展一個類是已經可以在兩者的基礎和強類型的視圖這將是在這兩個可用。唯一的解決方法是重新實現如上所述的強類型版本。

0

我不會把它放在View中,而是將它作爲ViewModel(有一個BaseViewModel)的屬性。測試會更容易,並確保您不會將業務邏輯放入視圖中。