[英]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.