的大图:通子类Razor视图
我发现什么似乎像剃刀的限制,我有想出它周围的好办法麻烦。
的玩家:
比方说,我有这样一个模型:
public abstract class BaseFooModel<T>
where T : BaseBarType
{
public abstract string Title { get; } // ACCESSED BY VIEW
public abstract Table<T> BuildTable();
protected Table<T> _Table;
public Table<T> Table // ACCESSED BY VIEW
{
get
{
if (_Table == null)
{
_Table = BuildTable();
}
return _Table;
}
}
}
而且一个子类是这样的:
public class MyFooModel : BaseFooModel<MyBarType>
{
// ...
}
public class MyBarType : BaseBarType
{
// ...
}
我希望能够通过MyFooModel
成被这样定义的剃刀视图:
// FooView.cshtml
@model BaseFooModel<BaseBarType>
但是,这是行不通的。我得到一个运行时错误说FooView
预计BaseFooModel<BaseBarType>
但得到MyFooModel
。回想一下MyFooModel
从BaseFooModel<MyBarType>
和MyBarType
遗址BaseBarType
继承。
我曾尝试:
我非剃刀地尝试了这一点,看看是否也是如此,它是。我不得不在视图中使用模板参数来使其工作。这里是一个非Razor视图:
public class FooView<T>
where T : BaseBarType
{
BaseFooModel<T> Model;
public FooView(BaseFooModel<T> model)
{
Model = model;
}
}
采用该结构,下面确实工作:
new FooView<MyBarType>(new MyFooModel());
我的问题:
我怎么能做到这一点与剃刀?如何通过FooView
这样的类型?
我不能,但没有解决这个办法吗?我能否以某种方式达到同样的体系结构?
让我知道我是否可以提供更多信息。我使用.NET 4.0和MVC 3
编辑:
现在,我只是增加了对BaseFooModel<BaseBarType>
每个子类剃刀视图。我对此并不兴奋,因为我不想在每次添加新模型时都要创建一个新视图。
另一种选择是利用这个事实,即我可以在没有剃须刀的情况下在常规C#类中使用此工作。我可以让我的剃刀视图@inherits
c#视图,然后调用一些渲染方法。我不喜欢这个选项,因为我不喜欢有两种呈现html的方式。
还有其他想法吗?我知道它很难理解,当我给类名与Foo
和Bar
问题的背景下,但我不能提供太多的信息,因为它是一个有点敏感。我对此表示歉意。
我有什么到目前为止,采用本杰明的回答是:
public interface IFooModel<out T>
where T : BaseBarModel
{
string Title { get; }
Table<T> Table { get; } // this causes an error:
// Invalid variance: The type parameter 'T' must be
// invariantly valid on IFooModel<T>.Table.
// 'T' is covariant.
}
public abstract class BaseFooModel<T> : IFooModel<T>
where T : BaseBarModel
{
// ...
}
什么结束了工作:
public interface IFooModel<out T>
where T : BaseBarModel
{
string Title { get; }
BaseModule Table { get; } // Table<T> inherits from BaseModule
// And I only need methods from BaseModule
// in my view.
}
public abstract class BaseFooModel<T> : IFooModel<T>
where T : BaseBarModel
{
// ...
}
往往我找到我已经打完了问题,或者至少后不久的时间回答。这次不行...... – lbstr 2013-03-26 20:46:30
什么是你BaseFooModel - 它有什么在页面上做(插入,只是观看,是它改变等)?这是相关的(一些示例代码) – NSGaga 2013-03-28 21:29:30
这是一个很好的点,但我认为,因为此信息在视图中使用它应该只得到读取。任何更新都应该在控制器操作方法中进行。 – 2013-03-28 21:34:04