0

我尝试从 ViewPage 继承,如这个问题Inheriting from ViewPage

但我得到一个

编译器错误消息:CS1061:“object”不包含“Spot”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Spot”(您是否缺少 using 指令或程序集引用?)

我的视图页面,通常我可以在直接从 ViewPage 继承时执行 Model.ChildProperty(Spot),所以我也在这里这样做。但它失败了。

 <%@ 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
{
}
}

那么如何在没有显式转换的情况下让它工作呢?

4

1 回答 1

2

您是否有理由需要 ViewPageBase 从 ViewPageBase 派生?看起来 ViewPageBase 没有添加任何内容。

最简单的解决方案是将 ViewPageBase 更改为从 ViewPage 派生,而不是从 ViewPageBase 派生。ViewPageBase 的 Model 属性是 object 类型的。ViewPage 的 Model 属性是 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);
    }
}
于 2010-05-28T16:33:46.607 回答