我使用Html.RenderPartial方法得到一个特殊的异常。 ASP.NET MVC似乎无法将ClassA类型的对象转换为ClassA类型的对象。我想知道是否有人知道发生了什么事。

这是更多背景信息。我有以下层次结构:

public interface IInterface
{
    string Name { get; }
}

public class ClassA : IInterface
{
    public string Name
    {
        get
        {
            return "ClassA ";
        }
    }
}


在视图中使用这两个:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<IInterface>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

<% foreach (IInterface item in Model)
   {
       Html.RenderPartial(string.Concat(item.Name, "UserControl"), item);
   }
%>

</asp:Content>


并具有一个带有此标头的名为ClassAUserControl的UserControl:

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


编辑:TypeHelpers.IsCompatibleObject(Object value)确定两种类型不同:

public static bool IsCompatibleObject<T>(object value)
{
    return ((value is T) || ((value == null) && TypeAllowsNullValue(typeof(T))));
}


在上述情况下,T为ClassA,值的类型为ClassA。这真的让我想知道为什么“值就是T”会失败...

最佳答案

您的用户控件期望一个ClassA对象,而您给它一个IInterface对象。他不能将其转换为对象A,因为他不知道它是A类。您可能会使用反射来进行某种操作以重铸IInterface以获取您的ClassA类型,但是这太丑了,我不想考虑再过一秒钟...

关于c# - ASP.NET MVC:传递到词典中的模型项的类型为“ClassA”,但是此词典需要类型为“ClassA”的模型项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3615646/

10-12 20:59