更新:问题已解决。
Darin Dimitrov的答案包含另一个相关问题的链接。该页面上的One of the proposed solutions最终为我们工作。
原始问题
下面的代码示例在MVC 2中可用,但在MVC 3中引发异常。有人知道为什么MVC 3引入了这一重大更改吗?有没有一种方法可以使它在MVC 3中正常工作,同时仍然允许我从 View 内部将 View 模型描述为接口(interface)?
在StackOverflow上还有另一个related question,但是它没有给我任何有关MVC 2和MVC 3之间为何存在差异的信息。
模型
public interface IPerson {
string Name { get; set; }
}
public interface ISpy : IPerson {
string CodeName { get; set; }
}
public class Spy : ISpy {
public string Name { get; set; }
public string CodeName { get; set; }
}
Controller 操作public ActionResult Index() {
var model = new Spy { Name = "James Bond", CodeName = "007" };
return View(model);
}
MVC2 View (完美运行)<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MvcApp.Models.ISpy>" %>
<p>CodeName: <%: Html.TextBoxFor(x => x.CodeName) %></p>
<p>Name: <%: Html.TextBoxFor(x => x.Name) %></p>
MVC3 View (抛出异常)@model MvcApp.Models.ISpy
<p>Name: @Html.TextBoxFor(x => x.Name)</p>
<p>CodeName: @Html.TextBoxFor(x => x.CodeName)</p>
MVC3异常信息
我在下面显示了相关的异常信息,但是您可以在这里查看错误页面的整个输出:https://gist.github.com/1443750。
Runtime Exception
System.ArgumentException: The property **`MvcApp.Models.ISpy.Name`** could not be found.
Source Error:
Line 1: @model MvcApp.Models.ISpy
Line 2: <p>CodeName: @Html.TextBoxFor(x => x.CodeName)</p>
Line 3: <p>Name: @Html.TextBoxFor(x => x.Name)</p>
Stack Trace:
[ArgumentException: The property MvcApp.Models.ISpy.Name could not be found.]
System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor, Type containerType, String propertyName) +502169
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) +421
System.Web.Mvc.Html.InputExtensions.TextBoxFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IDictionary`2 htmlAttributes) +58
System.Web.Mvc.Html.InputExtensions.TextBoxFor(HtmlHelper`1 htmlHelper, Expression`1 expression) +50
ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Projects\MvcApplication1\MvcApplication1\Views\Home\Index.cshtml:3
最佳答案
我已经brought this issue引起了Microsoft的注意。不幸的是,我得到的答复是:很抱歉,这是设计使然。我个人从这样一个答案中得出的结论是,如果MVC团队是出于设计目的,那么他们正在设计一个 buggy 产品。而且,不应责怪他们做出这样的设计决定,而应该责怪他们在发行说明文档的“重大更改”部分中未提及任何地方。如果他们提到了这一点,那么即使我们刻意知道这一重大变化,当我们做出迁移决定时,也将是我们的错。
无论如何,这是一个related question。
这是MVC小组的答案:
关于asp.net-mvc - MVC3中的模型绑定(bind)找不到继承的接口(interface)属性,但在MVC2中可以正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8448917/