2010-05-28 2 views
0

j'essaie de inhérant de ViewPage comme le montre cette question Inheriting from ViewPageHériter des forces ViewPage de coulée explicite du modèle vu

Mais je reçois un

compilateur Message d'erreur: CS1061: « objet » ne contiennent une définition pour « spot » et aucune méthode d'extension « spot » accepter un premier argument de type « objet » est introuvable (vous manque une directive à l'aide ou une référence d'assemblage?)

Mon ViewPage, normalement je peut faire Model.Ch ildProperty (Spot) quand j'hérite directement de ViewPage, donc je le fais aussi ici. Mais ça échoue.

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

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

Pour le faire fonctionner correctement, je dois faire comme ceci:

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

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

Voici mes classes:

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

Alors, comment puis-je faire fonctionner sans le casting explicite ?

+0

Si pas votre ViewPageBase Hériter System.Web.Mvc.ViewPage ? – Jab

Répondre

2

Y a-t-il une raison pour laquelle ViewPageBase doit dériver de ViewPageBase? Il ne semble pas que ViewPageBase ajoute quoi que ce soit.

La solution la plus simple consiste à modifier ViewPageBase pour dériver de ViewPage, pas de ViewPageBase. La propriété Model de ViewPageBase est de type objet. La propriété Model de ViewPage est TModel (en d'autres termes, le type que vous spécifiez).

Si vous devez absolument obtenir de ViewPageBase, vous pouvez essayer les suivantes (ce qui est le modèle qui utilise 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); 
    } 
} 
Questions connexes