2013-07-31 24 views
4

我正在開發一個基於體育的網站Asp.Net Mvc 4在Asp.Net Mvc中使用類似的控制器

該網站正在開發中,一次只顯示一項運動數據。

體育運動有類似的數據共同點,但他們有不同的數據。

網站支持許多運動,這就是爲什麼,我不希望通過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" 
}; 

的幫助下達到我更新AreaViewLocationFormatsRazorViewEngine的對象喜歡這一點,但不管事實是,在路線我州地區,它搜索ViewLocationFormats,而不是AreaViewLocationFormats如果我這樣做不是狀態名稱空間。

在這種情況下,我應該如何區分運動?

+1

你爲什麼不只是有不同類型的運動(例如「足球」,「網球」等)的桌子。那麼你的行動可能會採取一種運動類型的參數並返回適當的觀點? –

+0

我試圖找出哪個控制器實例化時,mvc DefaultControllerFactory引發異常,可能值得看看多租戶類似autofac http://code.google.com/p/autofac/wiki/MultitenantIntegration –

+0

@DanielPowell,因爲我不想爲控制器使用一個Assembly,所以我需要common(/ Controllers)。 – Onuralp

回答

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> 
{ 
} 
+0

對我來說有意義,基本控制器將具有「體育」控制器的基本屬性。 – TheOptimusPrimus