在Asp.Net Mvc中,如何在不同区域使用相似的控制器?

4
我正在使用Asp.Net Mvc 4开发一个基于运动的网站。
该网站正在开发中,一次只显示一项体育数据。
这些体育项目有共同的数据,但也有不同的数据。
由于该站支持多个体育项目,因此我不想使用if语句来分离它们的公共控制器/视图。
我尝试了以下方法:
我为每个运动创建了一个区域,并在该区域中描述了与该运动相关的控制器。
例如,在路由中,将首先声明控制器和区域的名称,如果在该区域中找不到,则会在默认位置(/Controllers)中进行搜索。
由于控制器具有相同的名称,Mvc DefaultControllerfactory会抛出“模糊控制器名称异常”。首先,我在区域中进行搜索,如果找不到,则通过编写自己的控制器工厂在默认位置中进行搜索。您可以通过此链接访问该项目。
在这种情况下,我的最大缺陷是,在路由中没有指定命名空间,而在视图中做相同的事情。因此,它将在区域中搜索视图,如果找不到,则会在默认位置搜索。由于项目支持主题,我使用自己的可主题化的razor视图引擎,而不是默认的razor视图引擎。可以通过link来访问它。
base.AreaViewLocationFormats = new[]
{
  _themeService.Current.BasePath + "/Views/Areas/{2}/{1}/{0}.cshtml",
  _themeService.Current.BasePath + "/Views/{1}/{0}.cshtml",
  _themeService.Current.BasePath + "/Views/Shared/{0}.cshtml","~/Themes/Default/Views/{1}/{0}.cshtml"
};

我更新了RazorViewEngineAreaViewLocationFormats对象,就像这样。但是,无论我在路由中指定区域,如果我不指定命名空间,它仍会搜索ViewLocationFormats而不是AreaViewLocationFormats
在这种情况下,我应该如何分离运动?

1
为什么不创建一个包含不同运动类型(例如“足球”,“网球”等)的表格呢?然后您的操作可以接受一个运动类型参数并返回相应的视图。 - dav_i
我认为异常是由mvc DefaultControllerFactory抛出的,当它尝试找出要实例化哪个控制器时,值得一看的是使用像autofac这样的多租户方式http://code.google.com/p/autofac/wiki/MultitenantIntegration。 - Daniel Powell
@DanielPowell,因为我想要为控制器使用一个汇编,所以我需要一个公共的(/Controllers)。 - onuralp
每个运动都有自己的模型吗? - ataravati
@ataravati - 是的,有。 - onuralp
显示剩余2条评论
1个回答

1
我在类似情况下所做的是创建一个基础通用控制器,如下所示:
public abstract class BaseController<TModel> : Controller where TModel : class, new()
{
   // Controller Actions to be shared by all the controllers that inherit form this one...
}

然后,您的控制器将会像这样:
public class TennisController : BaseController<Tennis>
{
}

我理解,基础控制器应该具备“体育”控制器的基本属性。 - TheOptimusPrimus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接