我正在尝试让文件上传器工作。我正在按照教程“A Back To Basics Case Study: Implementing HTTP File Upload with ASP.NET MVC including Tests and Mocks”,但我没有使用TDD,因为我时间紧迫,而且我对ASP.NET MVC也相对较新。
当我使用提供的示例代码(稍作修改以调整上下文中的差异)时,我在runtine处得到以下错误:
编译器错误消息:CS1579:foreach语句无法对“AnswerApp.Models.ViewDataUploadFilesResult”类型的变量进行操作,因为“AnswerApp.Models.ViewDataUploadFilesResult”不包含“GetEnumerator”的公共定义
有关于使用强制转换并将变量var声明为IEnumerable的建议,但没有一个对我有用。我花了几天时间研究这个问题,甚至尝试编写自己的枚举器,但即使在这种情况下,编译器也看不到我的GetEnumerator函数。
在我的控制器中:
public ActionResult ViewAnswer(ViewDataUploadFilesResult model)
{
List<ViewDataUploadFilesResult> r = new List<ViewDataUploadFilesResult>();
foreach (string file in Request.Files)
{
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
if (hpf.ContentLength == 0)
continue;
string savedFileName = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
Path.GetFileName(hpf.FileName));
hpf.SaveAs(savedFileName);
r.Add(new ViewDataUploadFilesResult()
{
Name = savedFileName,
Length = hpf.ContentLength
});
}
return View(model);
}
在我的模特中:
public class ViewDataUploadFilesResult
{
public string Name { get; set; }
public int Length { get; set; }
}
在我看来:
<ul>
<% foreach (AnswerApp.Models.ViewDataUploadFilesResult v in this.ViewData.Model) { %>
<%=String.Format("<li>Uploaded: {0} totalling {1} bytes.</li>",v.Name,v.Length) %>
<% } %>
</ul>
我应该创建自己的枚举器吗?如果是这样,我该怎么做呢。另外,如何使foreach循环可以识别它(当前创建GetEnumerator方法仍然会导致sam错误;因此,即使它确实存在,也会对foreach
循环不可见。
答案 0 :(得分:3)
您需要将视图绑定到ViewDataUploadFilesResult的IEnumerable而不是ViewDataUploadFilesResult:
IEnumerable<ViewDataUploadFilesResult>
然后在您的操作中,您可以在列表中调用View而不是一个结果:
View(r);
除非您希望人们将参数传递给您的例程,否则您的ViewAnswer操作不应包含任何参数。