为ASP.NET MVC创建BaseController

时间:2013-10-24 12:53:41

标签: c# asp.net asp.net-mvc asp.net-mvc-4 attributerouting

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

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 个答案:

答案 0 :(得分: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和东西移动到基本控制器,但是我对你的实现知之甚少,以确定你是否愿意这样做