我自己学习MVC和EF6,实际上我按照asp.net网站上的教程非常有帮助。今天我跟着this tutorial。这是使用代码优先的方法,但我使用数据库第一种方法。所以我按照说明将以下只读属性添加到模型中,在我的例子中添加到模型的元数据中。
[Display(Name = "Full Name")]
public string FullName
{
get
{
return LastName + ", " + FirstMidName;
}
}
但是当我尝试访问学生页面时出现此错误:
类型' System.InvalidOperationException'的例外情况发生在System.ComponentModel.DataAnnotations.dll中但未在用户代码中处理。附加信息:类型' MVCEF6DBFirst.Models.Student'的关联元数据类型。包含以下未知属性或字段:FullName。确保这些成员的名称与主要类型的属性名称匹配。
我知道最近添加的属性存在错误,因此我使用Google搜索但我无法找到正确的解决方案。
你能告诉我应该如何将这个属性添加到我的模型中
提前感谢。
答案 0 :(得分:1)
如果数据库表中不存在FullName列,这意味着您的EF模型Student类中不存在属性FullName,您将收到此错误。
我怀疑你能用元数据方法实现你想要的东西。但您可以修改属性在视图中的呈现方式。如果以下是您的EF模型类:
public partial class Student
{
public string FullName
{
get;
set;
}
}
然后创建另一个名为Student的分部类,并将其放在同一个程序集(文件夹)中,但放在具有不同文件名的不同文件中。 它看起来像这样:
[MetadataType(typeof(StudentMetadata))]
public partial class Student
{
}
public class StudentMetadata
{
[Display(Name = "Full Name")]
public string FullName { get; set; }
}
然后如果在视图中渲染EF模型Student类
@model Models.Student
@Html.DisplayForModel()
该属性的名称将以您希望的方式显示:
如果您想阻止用户通过只读它来编辑字段,您可能想要使用此
@Html.TextBoxFor(m => m.FullName, new{ disabled = "disabled", @readonly = "readonly" })
我不确定如何使用Html.EditorForModel
实现相同的效果或者,如果您仍然希望由其他两个属性FirstName和LastName组成的属性FullName,我会尝试:
您的EF模型类:
public partial class Student
{
public string FirstName
{
get; set;
}
public string SecondName
{
get; set;
}
}
课程扩展学生班级:
public class StudentChild : Student
{
[Display(Name="User name")]
public String FullName
{
get { return FirstName + ", " + SecondName; }
}
}
然后在您看来:
@model StudentChild
@Html.DisplayForModel()
我不确定后者是否是完美的方法,因为您的基础数据库架构发生了变化,那么您需要修改子类。
答案 1 :(得分:0)
正如我在@ sergik的回答中所评论的那样,我找到了另一种方法来完成这项工作(基于@ sergik的回答)。
public class StudentMetadata
{
}
[MetadataType(typeof(StudentMetadata))]
public partial class Student
{
[Display(Name = "Full Name")]
public string FullName
{
get
{
return LastName + ", " + FirstName;
}
}
}
using System.ComponentModel.DataAnnotations;
@ Sergik和我的答案都经过了测试,两者都运行良好。
希望对其他人有用。