在使用不同项目中存在的MetaData类时,DataAnnotations未得到反映

时间:2018-03-11 17:22:01

标签: asp.net asp.net-mvc

我正在学习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

的Web.config中提供以下代码
<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

以上两个项目都属于一个解决方案。

2 个答案:

答案 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概念