ForEach擴展方法的問題在對ASP.Net(4.0)Request.Files
(上傳)集合進行一些基本驗證時,我決定嘗試使用LINQ。通過IEnumerable <Request.Files>
收集是IEnumerable<T>
,所以不提供ForEach。愚蠢地,我決定建立一個可以完成這項工作的擴展方法。遺憾地說,沒有那麼多成功...
運行擴展方法(下)提出了一個錯誤:
Unable to cast object of type 'System.String' to type 'System.Web.HttpPostedFile'
很明顯的東西,我沒有得到,但我看不出它是什麼,所以冒着看起來像一個白癡(不會是第一次)的風險,這裏是3個代碼塊的代碼,以及對任何幫助的感謝諾言。
首先,擴展方法與操作參數:
//Extend ForEach to IEnumerated Files
public static IEnumerable<HttpPostedFileWrapper> ForEach<T>(this IEnumerable<HttpPostedFileWrapper> source, Action<HttpPostedFileWrapper> action)
{
//breaks on first 'item' init
foreach (HttpPostedFileWrapper item in source)
action(item);
return source;
}
當內部foreach循環擊中在「源」的「項目」,將出現錯誤。
下面是調用代碼(變量MaxFileTries和attachPath正確預先設定的):
var files = Request.Files.Cast<HttpPostedFile>()
.Select(file => new HttpPostedFileWrapper(file))
.Where(file => file.ContentLength > 0
&& file.ContentLength <= MaxFileSize
&& file.FileName.Length > 0)
.ForEach<HttpPostedFileWrapper>(f => f.SaveUpload(attachPath, MaxFileTries));
最後,行動目標,保存上傳文件 - 我們不會出現,甚至曾經到這裏,但爲了以防萬一,在這裏它是:
public static HttpPostedFileWrapper SaveUpload(this HttpPostedFileWrapper f, string attachPath, int MaxFileTries)
{
// we can only upload the same file MaxTries times in one session
int tries = 0;
string saveName = f.FileName.Substring(f.FileName.LastIndexOf("\\") + 1); //strip any local
string path = attachPath + saveName;
while (File.Exists(path) && tries <= MaxFileTries)
{
tries++;
path = attachPath + " (" + tries.ToString() + ")" + saveName;
}
if (tries <= MaxFileTries)
{
if (!Directory.Exists(attachPath)) Directory.CreateDirectory(attachPath);
f.SaveAs(path);
}
return f;
}
我承認,有些上面是一個拼湊「中位」的,所以我會得到我應得的,但如果任何人有一個很好的理解(或者至少已經完成了),也許我可以學到一些東西。
謝謝你。
確定我嘗試這樣做:'Request.Files.Cast()選擇(文件=>新HttpPostedFileWrapper (file => file.ContentLength> 0 && file.ContentLength <= MaxFileSize && file.FileName.Length> 0).ToList ()。ForEach(file => file.SaveUpload(attachPath, MaxFileTries));'具有相同的結果 –
Serexx
2011-03-11 06:46:10
爲什麼你是否需要'ForEach'中的'T'? –
Heinzi
2011-03-11 07:19:14