asp.net – 将通用模型的子类传递给剃刀视图
|
大图: 我发现看起来像是剃刀的限制,我有麻烦想出一个很好的方法. 玩家们: 假设我有一个这样的模型: 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.回想一下,来自BaseFooModel&MyBarType>的inits中的MyFooModel而MyBarType继承自BaseBarType. 我试过了 我在非剃刀的土地上试了一下,看看是否也是这样.我不得不在视图中使用模板参数来使其工作.这是非剃刀视图: 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和MVC 3. 编辑: 另一个选择是利用这样一个事实,我能够在没有剃刀的普通c#类中得到这个工作.我可以让我的剃须刀视图@继承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
{
// ...
}
解决方法您需要在类层次结构中引入一个具有 covariant通用类型参数的接口:public interface IFooModel<out T> where T : BaseBarType
{
}
并从上述界面派生您的BaseFooModel. public abstract class BaseFooModel<T> : IFooModel<T> where T : BaseBarType
{
}
在你的控制器中: [HttpGet]
public ActionResult Index()
{
return View(new MyFooModel());
}
最后,将视图的模型参数更新为: @model IFooModel<BaseBarType> (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp-classic – %%和经典asp之间有什么区别?
- 在没有ViewState ASP.Net的情况下获取当前页面的HTML
- 记一道毫无思路的算法题
- asp.net-mvc – 使用Ajax.Beginform的RedirectToAction,意外
- asp.net – PageMethod和URl重写
- 使用MVC在ASP.NET中实现API的最佳方法是什么?
- asp.net-mvc – 将SignalR与Azure表存储一起使用 – 什么架
- 在asp.net中使用加密数据库联接字符串保证数据安全
- asp.net-mvc – 从Web窗体转换为MVC
- 如何决定哪个是正确的,WebForms或MVC做ASP.NET时
- asp.net-mvc – 启用relaxedUrlToFileSystemMapp
- asp.net-mvc-3 – 是否可能显示从ASP.NET MVC 3中
- asp.net – 使用Global.asax有什么优点和缺点?
- asp.net – 错误4005表单身份验证失败 – 提供的
- ASP.NET GridView SortedAscendingHeaderStyle不
- ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies
- asp.net-mvc – 将ASP.NET MVC布局应用于Jquery.
- asp.net-mvc – 将隐藏文本字段附加到表单MVC
- asp.net-mvc – 在ASP.Net中路由保留字
- asp.net-mvc – asp.net mvc从包中排除css文件
