問題僅用於教育目的。繼承與ViewData類的屬性參數和插入組合
我有3個Web旅程的MVC應用程序,它們以許多方式相互鏡像 - 這可以方便地引入可以處理常見部件的Base類。
我也使用大量類的屬性正在投入viewData
這使得它方便的重用旅程之間的意見時,我可以,而不需要在繼承這一數據每程插入不同的電話號碼(或其他位)每個viewModel,因爲它是每旅程相同(不能放置到母版頁,因爲它顯示在許多不同的意見)。這些常量在生成電子郵件等時也用於代碼中。
[LayoutViewData(ContactNumber = ContactNumber, LegalType = LegalType, LegalReference = LegalReference)]
public class JourneyController : BaseJourneyController
{
private const string ContactNumber = "0800 161 5191";
private const string ContactNumberForPricingPage = "0800 051 3322";
private const string ProductReference = "LS0083";
private const string LegalReference = "conveyancing";
}
public class LayoutViewDataAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData.Add("ContactNumber", this.ContactNumber);
}
...
}
問題,我試圖解決:
有跡象表明,在旅程幾乎是相同的,並且可以移動到基本方法,但它們需要從常數的值。問題是隻有靜態屬性纔可以傳遞給屬性,這意味着我不能簡單地將它們改成抽象屬性,而只是用getter來繼續,並且繼續我的生活。
我的選擇:
更改方法簽名,這些常量傳遞到方法 - 我不喜歡這一點,因爲其將數據傳遞給基礎指示的執行應在類本身。
引入abstract獲取方法,然後返回用於基類的常量例如。
protected override string GetContactNumber() { return ContactNumber; }
我不喜歡,有沒有辦法強制歸還這些特定的常量和感覺有點哈克,但恕我直言,爲努力最少的最佳解決方案。
擺脫常量和屬性,並引入BaseViewModel類,該類將具有抽象屬性和每個旅程中會設置值的一種機制。或者可以是已經設置了這些屬性的3個基類。 - 不喜歡它,很多替代品。
你能想出一些其他的解決辦法,是將解決我的情況最少的工作和最低黑客。
我愛你的解決方案。我真的不喜歡每個控制器頂部的一堆常量,尤其是沒有被接口強制使用,但是讓每個VM都繼承自一些BaseVM,只是爲了進入一些模糊的地方,一些數據看起來更糟。這個解決方案更加優雅 - 簡單。 –