项目中很多时候需要定义自己的view基类,由于Razor的特殊性,所以他的基类只剩下一个WebViewPage这个类,无论是view还是partial view都是这个基类。而我们知道传统的web form的view的基类是WebFormView,partialview的基类是ViewUserControl。
由此我们知道razor的设计让我们更加方便实现。
定义:
Model:
class Parent;
class Child : Parent;
View基类:
Base<T> : WebViewPage<T> where T : class, new()
ChildBase<T> : Base<T> where T: Parent, new()
View:
partial view - test1:头部声明
@inherits ChildBase<Child>
main 页面在调用 test的代码:
@Html.Partial("test1", new Parent())
这里我想利用model的继承性来实现多个partial view的分离。
可是每次运行都会报错:
传入字典的模型项的类型为“Mvc4Example.Common.Parent”,但此字典需要类型“Mvc4Example.Common.Child”的模型项。
这个问题让我很纠结,因为在web form模式下这种设计是可以实现的,不知道为什么在Razor下不能运行了,还请哪位大拿给解释一下,万分感谢。
问题解决。
你的test1这个View继续自 ChildBase<Child>, 这个类的参数是一个Child类,你给人传一个Parent实例,不带这样的吧? 既然 test1 视图只需要一个 Parent 实例就可以执行, 为什么不声明成 ChildBase<Parent> ?
(装B得)PS:
不要为了代码复用而进行继承,继承的唯一目的是多态, 或者简单讲:只有在可以从调用方的代码中去除if/switch结构时使用继续 (引自 C++FAQ)
多谢这位大拿的指点。弱弱的问您一句,您对.net framework熟悉吗,有个协变,逆变的概念,能否给小弟讲解一下。多谢。
算是遇到大拿了。
@shen110: 没深入研究过,看过介绍,基本意思就是一种能从 ISome<Derived> 转换成 ISome<Base> 或相反的东西。 感觉原理应该是当 Some<T> 继承 ISome<T> 时, 对 Some<T> 进行类型实例化(动态生成) Some<Derived> 时, 为生成的 Some<Derived> 自动添加接口 ISome<Base>。
@Todd Pointer: 多谢,有时间多向您请教了,谢谢