[英]Using similar Controllers in areas in Asp.Net Mvc
我正在使用Asp.Net Mvc 4开发一个基于运动的网站。
该网站正在开发中,一次只显示一个运动数据。
这些运动有相似的数据,但也有不同的数据。
网站支持许多运动,这就是为什么,我不想通过使用if语句分隔运动来使用通用控制器/视图。
我试过这个:
我为每项运动创造了一个区域。 我描述了与该运动相关的区域控制器。
例如,在Route中,将声明控制器的名称和区域,首先它将在区域中搜索,如果不存在,将在默认情况下搜索( /Controllers
)。
因为控制器共享相同的名称,Mvc DefaultControllerfactory会抛出“不明确的控制器名称异常”。 首先,我正在搜索区域,如果找不到,那么我正在搜索默认情况下编写自己的控制器工厂。 您可以借助此链接访问该项目
在这种情况下,我最大的不足是; 没有在路由中指明命名空间在视图中做同样的事情。 因此它将搜索区域中的视图,如果找不到它,则它将默认搜索。 因为该项目是主题支持的,我使用自己的可变剃刀视图引擎,而不是默认的剃刀视图引擎。 可以通过此链接访问它
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"
};
我像这样更新了AreaViewLocationFormats
的AreaViewLocationFormats的对象,但不管我在路由中的状态区域,如果我没有声明命名空间,它会搜索ViewLocationFormats
而不是AreaViewLocationFormats
。
在这种情况下,我应该如何分开运动?
我在类似场景中所做的是创建一个这样的基础通用控制器:
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>
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.