我可以使用数据注释来防止属性出现在我的视图中吗?

时间:2012-06-18 18:24:29

标签: asp.net-mvc

使用T4模板从EF实体模型生成模型类。我有部分模型类,其唯一目的是向模型类添加[MetadataType(typeof(xxxMetdata))]属性。最后,我有一个类(xxxMetadata),其中包含我的数据注释(显示名称,格式等)。典型的模型名为TestABC123,其元数据类名为TestABC123Metadata

如何注释我的元数据类以防止在我的CRUD视图中生成/显示特定属性?我知道我可以在生成视图后删除属性,但我宁愿首先不生成属性。

我正在使用带有EF的MVC 4 RC。

谢谢!

更新1 -

这是我的部分课......

namespace XXX.Web.Models
{
    [MetadataType(typeof(TestAbcMetadata))]
    public partial class TestAbc
    {
    }
}

这是我的元数据类......

namespace XXX.Web.Models
{
    using System.ComponentModel;

    public partial class TestAbcMetadata
    {
        [ScaffoldColumn(false)]
        public int Id { get; set; }

        [ScaffoldColumn(false)]
        public int TestTypeId { get; set; }

        [DisplayName("Visit Number")]
        [Required]
        public int VisitId { get; set; }

    }
}

我尝试将[ScaffoldColumn(false)]添加到元数据类中的某个属性,但该属性仍显示在生成的视图代码中。想法?

2 个答案:

答案 0 :(得分:0)

为您的视图创建 ViewModels 。这些是您用来处理视图的普通POCO。

前:

public class AddUser
{
  public string EmailAddress { set;get;}
  public string Age { set;get;}
}

使用这些ViewModel在控制器操作和视图之间传输数据

public ActionResult GetThat()
{
  var addUserVM=new AddUser();
  return View(addUserVM);
}

您可以保持EF生成的类不变。那些代表您的域模型。但是视图模型适用于您的视图。它可能看起来很相似。但并非总是如此。

您可能需要一个映射层,以根据需要将您的Domain对象类映射到ViewModel。您可以考虑使用 AutoMapper 等库来编写或编写自己的代码。

答案 1 :(得分:0)

您需要做的是从头开始创建视图模型,并通过排除您不希望在视图上显示的属性将模型映射到此视图模型。

在viewmodel中尝试以下内容:

[HiddenInput(DisplayValue=false)]
public int ID { get; set; }

这是一篇很好的文章,可以澄清您的问题:What is an ASP.NET MVC ViewModel?

您可能会发现参考上一篇文章和讨论很有用:Search for an item in a ViewBag or use ViewModel instead?