我有一个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中传递页面标题和其他标记,以避免为不同的子域维护相同的代码,但我将是非常感谢,如果有人会建议更好的方法。
答案 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
和东西移动到基本控制器,但是我对你的实现知之甚少,以确定你是否愿意这样做