从ViewPage继承

时间:2008-12-16 05:03:40

标签: asp.net-mvc class inheritance

是否可以从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;
            }
        }
    }

3 个答案:

答案 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)。它将更容易测试,并确保您不会将业务逻辑放入视图中。