[英]use properties and metadata on base class in different namespace
我有一個單獨的 Visual Studio 項目,用於保存我的數據模型 (EF6)。 因此,我的實體位於命名空間Name1
(首先由 EF6 數據庫創建,但在此示例中簡化如下):
namespace Name1
{
public class Person
{
public string FName {get; set;}
public string LName {get; set;}
}
}
現在,我創建了一個新的 MVC 5 項目,它引用了數據 Visual Studio 項目,以便我可以訪問實體。 在我的 MVC 項目中,我想向實體添加一些元數據,如下所示:
namespace NameMvc
{
[MetadataType(typeof(PersonMetaData))]
public class Person : Name1.Person
{
}
public class PersonMetaData
{
[Display(Name = "Firstname")]
public string FName;
}
}
在我的控制器中,我想得到所有人,所以我有一個這樣的動作:
using Name1;
using NameMvc;
-- controller class code
public ActionResult Index()
{
var persons = db.Person.ToList();
return View(persons);
}
-- controller class code
在我看來,我嘗試通過以下方式訪問它:
@model IEnumerable<NameMvc.Person>
現在,當我運行代碼時,出現錯誤:
傳遞到字典中的模型項的類型為“System.Data.Entity.Infrastructure.DbQuery`1[Name1.Person]”,但此字典需要類型為“System.Collections.Generic.IEnumerable`1[Name”的模型項.MvcPerson]'。
我可能做的動作有些不對勁,因為db.Person
來自Name1
命名空間。
我想在我的視圖中使用元數據,這樣當我做這樣的事情@Html.DisplayNameFor(model => model.FName)
,它會顯示“名字”。
您在渲染視圖時遇到錯誤,因為您從操作中返回IEnumerable<Name1.Person>
,但您的視圖期待IEnumerable<NameMvc.Person>
。 當您在視圖中使用強類型模型時,它必須與操作返回的模型相匹配。
此錯誤有兩種可能的解決方案:
IEnumerable<Name1.Person>
作為其模型,或IEnumerable<NameMvc.Person>
作為模型。 當您使用MetadataType
向模型添加元數據時,最常見的方法是利用原始模型類作為分部類生成的事實。 您為分部類創建另一個“部分”並向其添加MetadataType
屬性。
但是,分部類不能跨程序集使用。 因此,這意味着如果您將模型移至其自己的程序集,則無法向 MVC 項目添加分部類以添加元數據。
要解決此問題,您可以執行以下操作之一:
我更喜歡選項#2 有幾個原因:
選項#2 的缺點是重復復制數據。 但是,您可以使用AutoMapper 之類的工具來簡化數據復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.