ASP.NET MVC 3 HtmlHelper异常不能识别继承的接口上的ModelMetadata

升级到MVC 3 RTM后,我得到了以前工作的例外。

这是场景。我有几个对象使用相同的底层接口IActivity和IOwned。

IActivity implements IOwned (another interface)

public interface IActivity:IOwned {...}

public interface IOwned 
{
    int? AuthorId {get;set;}
}

我有一个部分的观点,使用IActivity从其他具体的部分重用。

这是活动部分的定义。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IActivity>" %>
<%: Html.HiddenFor(item => item.AuthorId) %>

但是,它会引发异常。它在ModelMetadata中找不到AuthorId。

我猜测在以前的版本中,它看到了IActivity实现的接口。

任何想法,建议,短暂的复制类似的界面无处不在?

复制下面的堆栈跟踪。

[ArgumentException: The property IActivity.AuthorId Could not be found.]
   System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor,Type containerType,String propertyName) +498313
   System.Web.Mvc.ModelMetadata.GetMetadataFromProvider(Func`1 modelAccessor,Type modelType,String propertyName,Type containerType) +101
   System.Web.Mvc.ModelMetadata.FromLambdaExpression(Expression`1 expression,ViewDataDictionary`1 viewData) +393
   System.Web.Mvc.Html.InputExtensions.HiddenFor(HtmlHelper`1 htmlHelper,Expression`1 expression,IDictionary`2 htmlAttributes) +57
   System.Web.Mvc.Html.InputExtensions.HiddenFor(HtmlHelper`1 htmlHelper,Expression`1 expression) +51
   ASP.views_shared_activity_ascx.__Render__control1(HtmlTextWriter __w,Control parameterContainer) in c:\Users\...\Documents\Visual Studio 2010\Projects\ngen\trunk\...\Views\Shared\Activity.ascx:3
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +109
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
   System.Web.UI.Control.Render(HtmlTextWriter writer) +10
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter) +100
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +208
   System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
   System.Web.UI.Page.Render(HtmlTextWriter writer) +29
   System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +43
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +100
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterasyncPoint) +3060

解决方法

在System.Web.Mvc.ModelMetadata中的ASP.NET MVC 3中有一个突破性的变化/错误。 FromLambdaExpression方法,它解释了你得到的异常:

ASP.NET MVC 2.0:

...
case ExpressionType.MemberAccess:
{
    MemberExpression body = (MemberExpression) expression.Body;
    propertyName = (body.Member is PropertyInfo) ? body.Member.Name : null;
    containerType = body.Member.DeclaringType;
    flag = true;
    break;
}
...

ASP.NET MVC 3.0

...
case ExpressionType.MemberAccess:
{
    MemberExpression body = (MemberExpression) expression.Body;
    propertyName = (body.Member is PropertyInfo) ? body.Member.Name : null;
    containerType = body.Expression.Type;
    flag = true;
    break;
}
...

注意如何为containerType变量分配一个不同的值。所以在你的情况下,在ASP.NET MVC 2.0中,它分配了IOwned的值,这是AuthorId属性的正确声明类型,而在ASP.NET MVC 3.0中,它被分配给IActivity,之后当框架尝试查找属性时崩溃。

这是事情。就决议而言,我会等待微软的一些官方声明。我在发行说明文档中找不到有关这方面的相关信息。这是一个错误还是需要在这里解决的一些功能

现在,您可以使用非强制类型的Html.Hidden(“AuthorId”)帮助器,或者将Owned指定为您的控件的类型(我知道两个都是吮吸)。

相关文章

ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的...
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NE...
这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...