ASP.NET MVC:传递到字典中的模型项是“ClassA”类型,但此字典需要“ClassA”类型的模型项

时间:2010-09-01 06:54:33

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

我使用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'失败......

2 个答案:

答案 0 :(得分:1)

您的usercontrol期望一个ClassA对象,而您给它一个IInterface对象。他不能将它转发给对象A,因为他不知道它是A级。你可以用反射来重铸你的IInterface来取回你的ClassA类型,但是这样会很丑陋我不想考虑又一秒......

答案 1 :(得分:0)

你应该改变:

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

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

它不知道您的IInterface对象也是ClassA

或改变:

Html.RenderPartial(string.Concat(item.Name, "UserControl"), item);

转换(如果存在不是ClassA

的对象,则会失败
Html.RenderPartial(string.Concat(item.Name, "UserControl"), (ClassA)item);

或正确的最佳解决方案(如果您期望其他类型而不是ClassA

foreach (IInterface item in Model)

foreach (ClassA item in Model.OfType<ClassA>())

这只会传递ClassA类型的元素。