我使用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'失败......
答案 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
类型的元素。