我正在学习Asp.Net MVC。我在练习时偶然发现了这样的事情。我的Shop Project包含简单的Shopie
数据模型,它是一个部分类。我将DataAnnotations应用于另一个部分类ShopElob
,它是此商店数据模型的MetaData类。
namespace Shop
{
public partial class Shopie
{
public int ShopieId { get; set; }
public String ShopieName { get; set; }
public string Landmark { get; set; }
public decimal Minprice { get; set; }
public String Email { get; set; }
}
}
ShopElob
namespace Shop
{
[MetadataType(typeof(ShopElob))]
public partial class Shop
{
}
public class ShopElob
{
[Display(Name = "Shopiez Name")]
public String ShopName { get; set; }
[DisplayFormat(DataFormatString = "{0:0.00}")]
public decimal MinPrice { get; set; }
[DataType(DataType.EmailAddress)]
public String Email { get; set; }
}
}
但是当我在另一个MVC项目Shopie
中创建DataAnnotationsdemo
模型的强类型视图时,即使在MVC项目中引用Shop项目后,UI也没有反映MetaData类的DataAnnotations并在Views
<Pages>
<namespaces>
<add namespace="Shop.Shopie"/>
</namespaces>
</Pages>
在控制器中我有以下代码
public ActionResult Index()
{
PopulateData pd = new PopulateData();
Shopie s=pd.beginPopulate();
return View(s);
}
在View中,我将模型指定为
@model Shop.Shopie
以上两个项目都属于一个解决方案。
答案 0 :(得分:0)
所以对我来说这里的方法是不正确的 - 我认为将实体框架放在一个单独的项目中是一种很好的做法,但我仍然会在Presentation层中创建一个带注释的ViewModel类。其原因在于它更倾向于采用符合关注点分离的解决方案,并确保与表示相关的所有信息都在表示层中,并在单独的DAL项目中使用数据和逻辑。
我会在表示层中创建一个名为EntityViewModelExtensions的静态类,看起来像这样。
public static ShopViewModel ToViewModel(this Shop model)
{
return new ShopViewModel
{
ShopName = model.ShopName,
MinPrice = model.MinPrice,
Email = model.Email
};
}
这可以在您的Controller Action中调用
public ActionResult Index()
{
PopulateData pd = new PopulateData();
ShopViewModel s = pd.beginPopulate().Select(p => p.ToViewModel()).ToList();
return View(s);
}
您的ShopViewModel看起来像
public class ShopViewModel
{
[Display(Name = "Shopiez Name")]
public String ShopName { get; set; }
[DisplayFormat(DataFormatString = "{0:0.00}")]
public decimal MinPrice { get; set; }
[DataType(DataType.EmailAddress)]
public String Email { get; set; }
}
页面本身将接受ShopViewModel类型的模型。
这意味着所有与演示相关的信息(包括模型注释和显示属性)都保存在表示层中,而与数据库和业务逻辑相关的所有信息都在DAL中。
几周前我在DotNetNotts上就这个主题发表了演讲,如果你想查看它,你可以在YouTube上看到它。为了完整性,如果您确实想继续使用现有方法,我认为它失败的原因与名称空间有关。您应该引用的名称空间是Shop。我已经在一个非常类似的项目中对此进行了测试,并且它的工作没有任何问题,您的代码被有效地复制和粘贴。
我希望有帮助
答案 1 :(得分:0)
阻止在View中应用数据注释的要点是MetaData
属性未应用于确切的类。
在:
[MetadataType(typeof(ShopElob))]
public partial class Shop
{
}
正确的表格是:
[MetadataType(typeof(ShopElob))]
public partial class Shopie
{
}
其余的工作正常。显然我更喜欢选择@Steve Westgarth建议的Soc概念