Asp.net mvc 从ViewPage继承强制在视图中显式转换模型

Asp.net mvc 从ViewPage继承强制在视图中显式转换模型,asp.net-mvc,viewpage,Asp.net Mvc,Viewpage,我尝试从ViewPage中输入,如本问题所示 但是我有一个 编译器错误消息:CS1061:“object”不包含“Spot”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Spot”(是否缺少using指令或程序集引用?) 我的viewpage,通常我可以直接从viewpage继承Model.ChildProperty(Spot),所以我在这里也这样做。但它失败了 <%@ Page Language="C#" Inherits="Company.Site.ViewPag

我尝试从ViewPage中输入,如本问题所示

但是我有一个

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

我的viewpage,通常我可以直接从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
{
}
}
namespace Company.Site
{
公共类ViewPageBase:Company.Site.ViewPageBase,其中TModel:class
{
私有ViewDataDictionary\u viewData;
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共新ViewDataDictionary ViewData
{
得到
{
如果(_viewData==null)
{
SetViewData(新建ViewDataDictionary());
}
返回_viewData;
}
设置
{
SetViewData(值);
}
}
受保护的覆盖无效SetViewData(ViewDataDictionary viewData)
{
_viewData=新的ViewDataDictionary(viewData);
base.SetViewData(_viewData);
}
}
公共类ViewPageBase:System.Web.Mvc.ViewPage
{
}
}

那么,在没有显式强制转换的情况下,如何使其工作?

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

最简单的解决方案是将ViewPageBase更改为从ViewPage派生,而不是从ViewPageBase派生。ViewPageBase的模型属性的类型为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);
    }
}
公共类ViewPageBase:ViewPageBase{
私有ViewDataDictionary\u viewData;
公共新TModel模型{
得到{
返回ViewData.Model;
}
}
公共新ViewDataDictionary ViewData{
得到{
如果(_viewData==null){
SetViewData(新建ViewDataDictionary());
}
返回_viewData;
}
设置{
SetViewData(值);
}
}
受保护的覆盖无效SetViewData(ViewDataDictionary viewData){
_viewData=新的ViewDataDictionary(viewData);
base.SetViewData(_viewData);
}
}
您的ViewPageBase不应该继承System.Web.Mvc.ViewPage吗?