【问题标题】:How to create an ASP.net MVC user control with unknown generic type parameter?如何使用未知的泛型类型参数创建 ASP.net MVC 用户控件?
【发布时间】:2011-05-22 18:26:16
【问题描述】:

目前我正在为一些客户模型类使用基类。定义如下

public abstract class BaseCustomerModel<T>
   where T : IUserEntity

为了进一步说明,IUserEntity 包含:

public interface IUserEntity
{
   string ErrorMessage { get; }
}

该属性以及其他一些内容将在 ErrorTextControl.ascx 中公开:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<(...).Models.BaseCustomerModel<(...).IUserEntity>>" %>

<tr>
   <td colspan="2"><%: Html.DisplayFor(model => model.ErrorMessage) %></td>
</tr>

我会这样调用用户控件:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<(...).Models.MyUserModel>" %>
<% if (Model.HasErrors)
   {
      Html.RenderPartial("ErrorTextControl", Model);
   } %>

最后一段代码(MyUserEntity 实现 IUserEntity):

public class MyUserModel : BaseCustomerModel<MyUserEntity>

不幸的是,这显然不起作用,因为泛型类型不能隐式转换为 IUserEntity。因此在浏览器中导致以下错误消息:

异常详情:System.InvalidOperationException:传入字典的模型项是类型 '(...).Models.MyUserModel',但是这个字典需要一个模型项类型 '(...).Models.BaseCustomerModel`1[(...).IUserEntity]'。

所以问题:

  • 是否有任何方法可以使用尚未知道其类型的通用基类来定义用户控件?如果是,如何完成?
  • 如果没有,是否有任何解决方法、通用解决方案或想法能够拥有通用用户控件?

非常感谢。

【问题讨论】:

  • monty - 您需要某种将被绑定的通用接口(除了 IUserEntity )。你认出来了吗???我这样说是因为您将强键入属性集,因此这些属性将需要成为合同的一部分。如果它只是需要暴露给 ErrorTextControl.ascx 的 IUserEntity 部分,那么为什么不: " %> - 或者我是完全忽略了这里的重点:)
  • Jep,我也发现了自己……看看我发布的答案。
  • 好 - 你知道这是有道理的! ;)

标签: c# .net asp.net-mvc generics casting


【解决方案1】:

好吧,我自己想出了一个解决方案。

只是 BaseCustomerModel 的一个额外接口:

public abstract class BaseCustomerModel<T> : IContainErrorMessage
   where T : IUserEntity

这样用户控件就不必担心泛型了:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<(...).Models.IContainErrorMessage>" %>

【讨论】:

    【解决方案2】:

    你可以试试这个:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
    

    【讨论】:

    • 好拍!当然应该是这样的:'Inherits="System.Web.Mvc.ViewUserControl>"',但不幸的是:编译器错误消息:CS0311:类型'动态'不能用作泛型类型或方法“(...).Models.BaseCustomerModel”中的类型参数“T”。没有从 'dynamic' 到 '(...).IUserEntity' 的隐式引用转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2017-02-21
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多