Наследование от ViewPage вызывает явное приведение модели к виду - PullRequest
0 голосов
/ 28 мая 2010

Я пытаюсь наследовать от ViewPage, как показано в этом вопросе Наследование от ViewPage

Но я получаю

Сообщение об ошибке компилятора: CS1061: «объект» не содержит определения для «Spot» и не может быть найден метод расширения «Spot», принимающий первый аргумент типа «объект» (отсутствует директива using или сборка ссылка?)

Моя страница просмотра, обычно я могу использовать Model.ChildProperty (Spot), когда я наследую от ViewPage напрямую, поэтому я делаю это и здесь. Но это не удается.

 <%@ Page Language="C#" Inherits="Company.Site.ViewPageBase<WebSite.Models.SpotEntity>"  %>

    <h1><%= Html.Encode(Model.Spot.Title) %></h1>

Чтобы он работал правильно, я должен сделать так:

<%@ Page Language="C#" Inherits="Company.Site.ViewPageBase<WebSite.Models.SpotEntity>"  %>

    <h1><%= Html.Encode(((WebSite.Models.SpotEntity)Model).Spot.Title) %></h1>

Вот мои занятия:

namespace Company.Site
{
public class ViewPageBase<TModel> : Company.Site.ViewPageBase where TModel:class
{
    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 ViewPageBase : System.Web.Mvc.ViewPage
{
}
}

Так как мне заставить его работать без явного приведения?

1 Ответ

2 голосов
/ 28 мая 2010

Есть ли причина, по которой вам нужно ViewPageBase для получения из ViewPageBase? Похоже, ViewPageBase ничего не добавляет.

Самое простое решение - изменить ViewPageBase, чтобы он был производным от ViewPage, а не от ViewPageBase. Свойство Model ViewPageBase имеет тип объекта. Свойство Model для ViewPage - это TModel (другими словами, указанный вами тип).

Если вам абсолютно необходимо наследовать от ViewPageBase, вы можете попробовать следующее (это шаблон, который использует ViewPage:

public class ViewPageBase<TModel> : ViewPageBase {
    private ViewDataDictionary<TModel> _viewData;

    public new TModel Model {
        get {
            return ViewData.Model;
        }
    }

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