繁体   English   中英

为ASP.NET MVC创建BaseController

[英]Creating BaseController for ASP.NET MVC

我有一个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中传递页面标题和其他标签,以避免为不同的子域维护相同的代码,但是我会非常感谢有人提出更好的方法。

你可以做这样的事情

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和其他内容也需要将它们也移到基本控制器上,但是我对您的实现不了解,无法确定这是否是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM