2013-10-24 43 views
1

我有一个ASP.NET MVC 4项目,它有主页面,访问者应该选择副主题。所以结构是:为ASP.NET MVC创建BaseController

sypalo.com 
photo.sypalo.com 
seo.sypalo.com 
... and so on 

我正在使用AttributeRouting.net nuget包来处理路由到子域。因此,每个控制器位于独立的区域,并有如下数据注解(SEOController在这种情况下):

[RouteArea("SEO", Subdomain = "seo")] 
public class SEOController : Controller 
{ 
    private IPostRepository PostRepository; 

    public SEOController() 
    { this.PostRepository = new PostRepository(new BlogEntities()); } 

    public SEOController(IPostRepository PostRepository) 
    { this.PostRepository = PostRepository; } 

    [GET("{page?}")] 
    public ActionResult Index(int? page) 
    { return View(PostRepository.GetPosts("SEO", page ?? 1)); } 

    [GET("{year}/{month}/{link}")] 
    public ActionResult Details(int year, int month, string link) 
    { 
     Post post = PostRepository.GetPost("SEO", link); 
     if (post == null) return HttpNotFound(); 
     return View(post.Text.Replace(ViewRes.Main.ReadMore, "")); 
    } 
} 

我实现的存储库,以减少重复的代码量,但仍需要与各个子域CRUD操作控制器。他们所有使用单独的表都有单独的字段,称为子域,我在每个控制器中静态地传递子域名。

我在寻找如何创建具有CRUD功能的基础控制器类,并且可以在派生类中扩展它,因为每个子域也都有自己的动作/视图。 AFAIK我可以指定View或SharedView的位置,使其具有多个控制器使用的单一视图(单个索引/详细信息/编辑视图),并在ViewBag中传递页面标题和其他标记以避免为不同子域保留相同的代码,但我会非常感谢,如果有人会建议更好的方法。

回答

1

你可以做这样的事情

public abstract class MyBaseController : Controller 
{ 
    public virtual void Create() 
    { 
     //standard implementation 
    } 
} 

public class SEOController : MyBaseController 
{ 
    public override void Create() 
    { 
     //specific to SEO 
    } 
} 

你只覆盖你需要什么具体到你的SEOController,一切你可以只使用默认MyBaseController方法。

想要将PostRepository和东西移动到基本控制器,如果其他类也需要它们,但我不知道您的实现是否足以确定如果这就是您想要做的。

+0

嗨凯尔,没错,我会把PostRepository移动到基础控制器。我的目标是在基本控制器中实现CRUID操作的标准实现,我不想重写它们,只需在派生类(SEOController)中添加其他操作/视图即可。 –

+0

刚试过单独的应用程序(新测试ASP.NET MVC4项目),一切按预期工作,我只从我的基础控制器继承SEOController,不定义任何操作,并且没有任何问题打开索引视图。因此,我需要处理AttributeRouting以使其以某种方式工作。我的基础控制器没有像([RouteArea(“SEO”,Subdomain =“seo”)])的数据注释,我在派生类中指定它,但我在基本控制器中的操作有[GET(“{page? }“)]指定,不知道可能是多数民众赞成在一个问题... –