我有一个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中传递页面标题和其他标记以避免为不同子域保留相同的代码,但我会非常感谢,如果有人会建议更好的方法。
嗨凯尔,没错,我会把PostRepository移动到基础控制器。我的目标是在基本控制器中实现CRUID操作的标准实现,我不想重写它们,只需在派生类(SEOController)中添加其他操作/视图即可。 –
刚试过单独的应用程序(新测试ASP.NET MVC4项目),一切按预期工作,我只从我的基础控制器继承SEOController,不定义任何操作,并且没有任何问题打开索引视图。因此,我需要处理AttributeRouting以使其以某种方式工作。我的基础控制器没有像([RouteArea(“SEO”,Subdomain =“seo”)])的数据注释,我在派生类中指定它,但我在基本控制器中的操作有[GET(“{page? }“)]指定,不知道可能是多数民众赞成在一个问题... –