我重构了一个使用EF5 Database First的应用程序。应用程序使用元数据类将数据注释添加到实体属性。在重构之前,这些都有效。它们大多只是显示名称和数据格式。
示例:
[MetadataType(typeof(QueryDetailsResultMetadata))]
public partial class QueryDetailsResult : IPortfolio
{
public string Source { get { return "Local"; } }
}
public class QueryDetailsResultMetadata
{
//Fields from QueryDetailsResult requiring annotations
[Display(Name = "Company Name")]
public string SiteName { get; set; }
[Display(Name = "Contact Telephone Number")]
public string ContactTelNo { get; set; }
}
在重构之前,部分类没有从接口继承,并且它没有非映射属性。然而,这些变化是必需的。这两者都不应该引起问题,因为两者都被证明是有效的解决方案。
界面如下所示
public interface IPortfolio
{
int Id { get; set; }
string SiteName { get; set; }
string YearOfManufacture { get; set; }
string Contact { get; set; }
string ContactTelNo { get; set; }
string Source { get;}
}
显示屏使用这样的属性
@Html.DisplayNameFor(model => model.Portfolio.ContactTelNo)
在运行时的View上,将显示属性名称而不是显示名称。有什么想法吗?我看不出任何理由让注释被打破
//修改
我尝试将注释移动到partial中的新非映射字段,并将其从元数据类中删除。要知道它是否有任何影响。没有。还要仔细检查edmx与部分类和元数据文件在同一个命名空间中。
有关检查或尝试的内容的任何想法?这方面没有取得多大成功,大多数谷歌搜索结果只是说使用已经存在的元数据类。
//第二次编辑
将注释从元数据类中移出并移到界面上就可以了。
答案 0 :(得分:3)
DataAnnotation属性如何与接口混合有点令人困惑,因为:
一方面,类不会从其接口继承属性:Is it possible to use DataAnnotations with Interfaces?
另一方面,您可以/需要将属性放在接口上:ASP.NET MVC DisplayAttribute and interfaces
但它的工作原理仅取决于视图中“容器”的类型,因此我们考虑以下类型:
public class QueryDetailsResult : IPortfolio
{
public string SiteName { get; set; }
}
public interface IPortfolio
{
string SiteName { get; set; }
}
因此,如果您的视图中有@Html.DisplayNameFor(model => model.Portfolio.SiteName)
,您的模型类看起来像
public class Model {
public QueryDetailsResult Portfolio { get; set; }
}
然后你需要将DisplayAttribute
放在SiteName
类的QueryDetailsResult
属性上,因为MVC在model.Portfolio.SiteName
表达式中查找“容器”类型{ {1}}
但是如果您将模型类定义为
QueryDetailsResult
然后您需要将其放在public class Model {
public IPortfolio Portfolio { get; set; }
}
接口的SiteName
属性上,因为您的“容器”类型是IPortfolio
接口。