我正在使用Asp.Net Mvc 4开发一个基于运动的网站。
该网站正在开发中,一次只显示一项体育数据。
这些体育项目有共同的数据,但也有不同的数据。
由于该站支持多个体育项目,因此我不想使用if语句来分离它们的公共控制器/视图。
我尝试了以下方法:
我为每个运动创建了一个区域,并在该区域中描述了与该运动相关的控制器。
例如,在路由中,将首先声明控制器和区域的名称,如果在该区域中找不到,则会在默认位置(
由于控制器具有相同的名称,Mvc DefaultControllerfactory会抛出“模糊控制器名称异常”。首先,我在区域中进行搜索,如果找不到,则通过编写自己的控制器工厂在默认位置中进行搜索。您可以通过此链接访问该项目。
在这种情况下,我的最大缺陷是,在路由中没有指定命名空间,而在视图中做相同的事情。因此,它将在区域中搜索视图,如果找不到,则会在默认位置搜索。由于项目支持主题,我使用自己的可主题化的razor视图引擎,而不是默认的razor视图引擎。可以通过link来访问它。
我更新了
在这种情况下,我应该如何分离运动?
该网站正在开发中,一次只显示一项体育数据。
这些体育项目有共同的数据,但也有不同的数据。
由于该站支持多个体育项目,因此我不想使用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"
};
我更新了
RazorViewEngine
的AreaViewLocationFormats
对象,就像这样。但是,无论我在路由中指定区域,如果我不指定命名空间,它仍会搜索ViewLocationFormats
而不是AreaViewLocationFormats
。在这种情况下,我应该如何分离运动?