1

我有一个这样设置的页面

public partial class _Default : ViewBasePage<EmployeePresenter, IEmployeeView>,
                                 IEmployeeView
{
...
}

在我的基本页面内

public abstract class ViewBasePage<TPresenter, TView> : 
        Page where TPresenter : Presenter<TView> where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = GetView(); // <- Works
            //_presenter.View = (TView)this; <- Doesn't work
        }
    }

    /// <summary>
    /// Gets the view. This will get the page during the ASP.NET
    /// life cycle where the physical page inherits the view
    /// </summary>
    /// <returns></returns>
    private static TView GetView()
    {
        return (TView) HttpContext.Current.Handler;
    }
}

我需要做的实际上是强制转换 (TView)_Default,使用我的 GetView() 方法确实以该结果结束。在基本页面内我做不到

_presenter.View = (TView)this;

因为这实际上ViewBasePage<TPresenter,TView>是它不能直接转换为 TView。

所以我的实际问题是有没有其他方法可以让我感觉不那么老套,如果这是主要选择,那么通过这种方式处理我的页面,我真的需要担心什么吗?

编辑:

我要写的确切部分是

private static TView GetView()
{
    return (TView) HttpContext.Current.Handler;
}

因为我觉得在这种情况下能够引用回页面是相当严重的黑客攻击。

4

1 回答 1

1

我看不出(TView)this预期会如何工作。 this指的是恰好是Page. 您无法将 a 转换PageIView.

您当前的实现看起来并不老套。

我错过了什么吗?

编辑:现在我对您的情况有了更好的了解;如何让 ViewBasePage 从 IView 继承(并将其从您的 _Default 页面中删除)?

编辑此外,如果您希望 _Default 页面必须实现接口中定义的功能,您可以让 ViewBasePage 类抽象地实现接口的功能。

public class _Default : ViewBasePage<Presenter<IView>, IView>
{
    #region Overrides of classB
    public override void test()
    {
        //perform the test steps.
    }
    #endregion
}
public abstract class ViewBasePage<TPresenter, TView> :
    Page, IView
    where TPresenter : Presenter<TView>
    where TView : IView
{
    protected TPresenter _presenter;

    public TPresenter Presenter
    {
        set
        {
            _presenter = value;
            _presenter.View = (TView)((IView)this); //<- Now it does work
        }
    }
    #region Implementation of IView
    public abstract void test();
    #endregion
}
public interface IView
{
    void test();
}
public abstract class Presenter<TView> where TView : IView
{
    public TView View { get; set; }
    public virtual void OnViewInitialized(){}
    public virtual void OnViewLoaded(){}
}
于 2009-09-03T18:28:33.607 回答