为同一型号的多个版本保留DRY控制器和视图?

时间:2015-10-23 01:04:40

标签: asp.net-mvc inheritance dry

我想对可以分配给页面的3个不同标签组使用相同的模型。我想为所有3组使用相同的Controller和Views。

模型

我打算使用TPH,因为这是默认设置。有没有理由不这样做?

public class Tag 
{
    public int ID {get;set;}
    public string TagText {get;set;}
    public int PageAssignments {get;set;}
}

public class TagType1: Tag
{}
public class TagType2: Tag
{}
public class TagType3: Tag
{}

public class Page 
{
    public int ID {get;set;}
    public string Title {get;set;}
    public string Content {get;set;}
    public ICollection<Tag> TagsOfType1 {get;set;}
    public ICollection<Tag> TagsOfType2 {get;set;}
    public ICollection<Tag> TagsOfType3 {get;set;}
}

控制器

我希望使用BaseController来执行繁重的工作。

// select and display
public virtual IQueryable<Tag> TagsOfTypeAsQueryable { get; set; }

// add, edit and delete
public virtual DbSet<Tag> TagsOfTypeAsDbSet { get; set;  }


public ActionResult Index()
{
    List<Tag> allTags = TagsOfTypeAsQueryable.ToList();
    return View(allTags);
}
public ActionResult Add(Tag tag)
{
    TagsOfTypeAsDbSet.Add(tag);
}
.... more actions that can be used for all 3 types of tag....

派生3个控制器,提供正确的IQueryable或DbSet来操作。

public override DbSet TagsOfTypeAsDbSet 
{
    get
    {
        return DB.TagsOfType1;
    }
}

public override IQueryable TagsOfTypeAsQueryable 
{
    get
    {
        return DB.TagsOfType1.AsQueryable();
    }
}

......但问题......

我不允许使用相同类型的3个DbSets:

public DbSet<Tag> TagsOfType1 {get;set;}
public DbSet<Tag> TagsOfType2 {get;set;}
public DbSet<Tag> TagsOfType3 {get;set;}

但是如果我创建3个DbSets,就像这样,我不能使用BaseController来共享3种类型之间的动作:

public DbSet<TagType1> TagsOfType1 {get;set;}
public DbSet<TagType2> TagsOfType2 {get;set;}
public DbSet<TagType3> TagsOfType3 {get;set;}

<小时/> 有没有办法可以让我对所有3种标签使用相同的控制器?

0 个答案:

没有答案