2012-10-09 34 views
2

很多時候我們需要引用服務器上的另一個文件。無論是隻是一個圖像,或另一個asp頁面。例如:ASP.NET以強類型的方式引用圖像或asp文件

if (success) 
{ 
    img1.ImageUrl = "RightArrow.jpg" 
} 

這裏的問題是,如果有人不小心改變字符串「RightArrow.jpg」到「RghtArrow.jpg」,也不會導致編譯時錯誤。並且可能需要很長時間才能注意到運行時錯誤。

那麼這裏是否有最佳做法? 當然,我可以爲我建立自己的小機制...但是我徘徊是否有任何內置的東西。

一些東西,也許是強類型的老式:

img1.ImageUrl = Images.RightArrow; 
+0

你可以使用常量。你也可以使用嵌入式資源。 –

+0

常量不會檢查文件是否存在。當然,我可以做一些機制,檢查每一個現在和他們是否所有的常量是有效的文件名..但我正在尋找內置的東西。 – Letterman

+0

那麼嵌入式資源和應用程序設置呢? –

回答

2

爲什麼不使用設置?如果你做了你的代碼是強類型,例如:

img1.ImageUrl = Settings.Default.Images.RightArrow 

如果您有這些資源的數量有限,這可能是因爲你甚至可以改變路徑/名稱無需重新編譯......

一個很好的解決方案
+1

不是說這不是一個正確的答案,但圖像不是真正的設置,所以他們真的應該放在那裏嗎?這似乎有誤導性,但如果它起作用,它就會起作用。我仍然會使用@Sean Dunford的方法,儘管只是使用一個結構。這允許你把它放在一個有意義的地方,在邏輯上和直覺上都是合理的。 –

+1

是的,圖像不是設置,但是根據其他變量甚至用戶選擇的選項決定要顯示的圖像(例如在設置選項卡中)可以當然是設置...當然,肖恩的方法是可行的,但是最終你會得到硬編碼的值,這些值不是強類型的... –

+0

@DeanK。有沒有任何機制來檢查文件是否存在? – Letterman

2

你可以保留圖片名稱列表嗎?

List<string> CollectionPictureUri = new List<string>(); 
CollectionPictureUri.Items.Add("RightArrow.jpg"); 

if (success) 
{ 
    img1.ImageUrl = CollectionPictureUri[0]; 
} 

或者,如果你使用一個Map,那麼關鍵可能只是[RightArrow]

然後你就可以初始化所有的項目在一個代碼塊,並確保它們是正確的在一個地方。

編輯: 您還可以使用斷言來驗證您的字符串解析爲正確的名稱。 http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert%28v=vs.110%29.aspx

還有其他測試技術可能對您有用。使用visual studio,您可以防止編譯代碼,直到解決了類似的錯誤。

+1

我打算建議類似方法,如果您定義某種圖像結構,則可以在一段代碼中設置所有路徑。然後,只需使用結構的「接口」即可訪問。 –

+0

@AndrewHagner這是一個好主意。我打算說使用一個自定義類,但是一個結構看起來更合適,因爲他可能需要最少量的幫助函數。這聽起來像他只需要某種集合來集合一個地方的所有擴展。 –

+1

這正好指的是「我可以爲此構建我自己的小機制」。這是一個很好的解決方案,但我徘徊 - asp.net是否不支持任何內置的解決方案,以解決這個非常常見的問題? – Letterman

1

您總是可以使用T4模板爲實際存在的文件生成一個具有常量的類。這與T4 MVC模板爲/ Content目錄的腳本和內容所做的相似;它在運行時掃描這些目錄,並創建常量。