Обратная ссылка ASP.NET BasePage на конкретную реализацию

У меня есть страница, которая настроена так

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

так как я чувствую, что это довольно грубый взлом, чтобы иметь возможность ссылаться на страницу в этом контексте.


person Chris Marisic    schedule 03.09.2009    source источник
comment
Хорошо, я удалил это из своего примера. Я оставил его как артефакт, но он не использовался.   -  person Chris    schedule 04.09.2009


Ответы (1)


Я не понимаю, как ожидается, что (TView)this будет работать. this относится к классу, который является Page. Вы не можете преобразовать Page в IView.

Ваша текущая реализация не выглядит хакерской.

Я что-то упускаю?

EDIT: теперь, когда я немного лучше понимаю вашу ситуацию; как насчет наследования ViewBasePage от IView (и удаления его со страницы _Default)?

EDIT Кроме того, если вы хотите, чтобы страница _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(){}
}
person Chris    schedule 03.09.2009
comment
Страница реализует IView, скажем, в Page_Load{ IView view = (IView)THIS; } отлично работает на уровне страницы, именно на базовой странице ЭТО относится к базовой странице, а не к странице, на которой он реализует IView. Хакерская часть использует HttpContext - person Chris Marisic; 03.09.2009
comment
Это было бы разрешено работать только в том случае, если бы вы могли гарантировать, что наследующий класс также унаследовал IView. Чтобы гарантировать, что наследующий класс наследует IView, необходимо, чтобы ViewBasePage также наследовал от IView. - person Chris; 03.09.2009
comment
Я пытаюсь списать вызов HttpContext - person Chris Marisic; 04.09.2009
comment
Хорошо, я забыл удалить это из моего примера, взгляните на него сейчас. - person Chris; 04.09.2009
comment
Вы пробовали построить это? Это все еще получает ошибку литья. C#, похоже, не понимает, что TView внутри ViewBasePage такой же, как TView внутри Presenter‹TView› даже с ограничениями where. - person Chris Marisic; 04.09.2009
comment
И я не могу сделать: Page, TView, так как он говорит, что ему нужно имя интерфейса для этого - person Chris Marisic; 04.09.2009
comment
Ах, вы попробовали лучший пример до того, как я сменил TView на IView. Как только вы сделаете это изменение, оно сработает. Да, я скомпилировал это. Я просто не в той версии скопировал. - person Chris; 04.09.2009
comment
Я просто скопировал его и вставил в новый файл cs, и результат все тот же. - person Chris Marisic; 04.09.2009
comment
Ой, вы правы; Я забыл шаг в кастинге. Я исправил пример с помощью этого кода: _presenter.View = (TView)((IView)this); - person Chris; 04.09.2009