是否可以从ViewPage和ViewPage继承< T>?或者我必须实现两者。目前这是我对ViewPage的看法。我是否需要重复自己并对ViewPage< T> ??
执行相同的操作 public class BaseViewPage : ViewPage
{
public bool LoggedIn
{
get
{
if (ViewContext.Controller is BaseController)
return ((BaseController)ViewContext.Controller).LoggedOn;
else
return false;
}
}
}
答案 0 :(得分: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>
{
}
答案 1 :(得分:1)
根据您的工作方式,您可能需要查看
ViewContext.HttpContext.Request.IsAuthenticated
它可能会节省您一些时间,而不是扩展ViewPage类。
如果您有其他数据,可以将扩展方法写入提供数据的类之一。例如。如果LoggedIn存储在会话中,您可以扩展上下文以在方法中为您提供IsLoggedIn()。
编辑:
当你扩展一个已经在基本和强类型视图中可用的类时,它将在两者中都可用。唯一的另一种方法是重新实现上面的强类型版本。
答案 2 :(得分:0)
我不会把它放在View中,而是将它作为ViewModel上的属性(具有BaseViewModel)。它将更容易测试,并确保您不会将业务逻辑放入视图中。