Наследование от ViewPage - PullRequest
       17

Наследование от ViewPage

4 голосов
/ 16 декабря 2008

Можно ли наследовать от ViewPage и ViewPage ?? Или я должен реализовать оба. В настоящее время это то, что у меня есть для ViewPage. Нужно ли повторяться и делать то же самое для ViewPage ??

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

Ответы [ 3 ]

3 голосов
/ 16 декабря 2008

Создать обе версии:

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 голос
/ 16 декабря 2008

В зависимости от того, как вы делаете вещи, вы можете посмотреть на

ViewContext.HttpContext.Request.IsAuthenticated

это может сэкономить вам время вместо расширения класса ViewPage.

Если есть какие-то другие данные, которые вам нужны, вы можете написать метод расширения для одного из классов, который предоставляет данные. Например. если LoggedIn был сохранен в сеансе, вы можете расширить контекст, чтобы получить метод IsLoggedIn () в методе.

Edit:

Поскольку вы расширяете класс, который уже доступен как в базовом, так и в строго типизированном представлении, он будет доступен в обоих. Единственный выход - переопределить строго типизированную версию, как указано выше.

0 голосов
/ 23 декабря 2008

Я бы не поместил это в View, вместо этого я бы использовал его как свойство ViewModel (есть BaseViewModel). Это будет легче протестировать, а также убедиться, что вы не идете по пути внедрения бизнес-логики в представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...