在Asp.Net Mvc中的区域中使用类似的控制器

时间:2013-07-31 10:53:48

标签: c# asp.net-mvc

我正在开发一个基于运动的网站Asp.Net Mvc 4

该网站正在开发中,一次只显示一项运动数据。

体育运动有相似的数据,但也有不同的数据。

网站支持许多体育运动,这就是为什么,我不想通过使用if语句分隔运动来使用通用控制器/视图。

我试过这个:

我为每项运动创造了一个区域。我描述了与该运动相关的区域控制器。

例如,在Route中,将说明控制器和区域的名称,首先它将在区域中搜索,如果不存在,则将默认搜索(/Controllers)。

由于控制器共享相同的名称,因此Mvc DefaultControllerfactory会抛出“不明确的控制器名称异常”。首先,我正在搜索区域,如果找不到,那么我正在搜索默认情况下编写自己的控制器工厂。您可以借助此link

来访问该项目

在这种情况下,我最大的不足是;没有在路由中指明命名空间在视图中做同样的事情。因此它将搜索区域中的视图,如果找不到它,则它将默认搜索。因为该项目是主题支持的,我使用自己的可变剃刀视图引擎,而不是默认的剃刀视图引擎。可以通过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如果我不说明名称空间。

在这种情况下,我该如何分开运动?

1 个答案:

答案 0 :(得分: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>
{
}