升级到MVC 3 RTM后,我得到了一个以前工作的例外.
这是场景.我有几个使用相同底层接口IActivity和IOwned的对象.
IActivity implements IOwned (another interface)
public interface IActivity:IOwned {...}
public interface IOwned
{
int? AuthorId {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个局部视图,它使用IActivity从其他具体的部分重用.
以下是Activity Partial的定义.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IActivity>" %>
<%: Html.HiddenFor(item => item.AuthorId) %>
Run Code Online (Sandbox Code Playgroud)
但是,它会引发异常.它在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 …Run Code Online (Sandbox Code Playgroud) 我觉得我错过了一些基本的东西.
我有2个接口.一个叫做IIdentifiable,它指定Id属性的存在.第二个可以是任何可识别的东西.见下面的代码.
public interface IIdentifiable
{
Guid Id { get; set; }
}
public interface IPerson : IIdentifiable
{
string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题:
当使用Html.HiddenFor(或任何其他帮助器方法)并且模型强烈地键入IPerson接口时,访问IIdentifiable接口的属性时出错.我可以通过直接针对Model.Id来访问和显示IIdentifiable属性中的数据,但是在使用lambda表达式并以这种方式访问模型时则不能.
我得到的错误是"无法找到属性*.IPerson.Id".
这只是在使用Razor视图引擎时的情况.我知道这是使用ASP.NET MVC 2和WebForms视图引擎.我还没有在使用WebForms视图引擎的ASP.NET MVC 3上尝试过它.