#asp.net #asp.net-mvc-3 #foreach
#asp.net #asp.net-mvc-3 #foreach
Вопрос:
Я пытаюсь заставить загрузчик файлов работать. Я следую руководству «Тематическое исследование «Назад к основам: реализация загрузки HTTP-файлов с ASP.NET MVC, включая тесты и макеты«, но я не использую TDD, потому что у меня мало времени, а также я относительно новичок в ASP.NET MVC.
Когда я использую приведенный пример кода (с незначительными изменениями для корректировки разницы в контексте) Я получаю следующую ошибку при запуске:
Сообщение об ошибке компилятора: 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
цикла.
Ответ №1:
Вам нужно, чтобы ваше представление привязывалось к IEnumerable из ViewDataUploadFilesResult вместо ViewDataUploadFilesResult:
IEnumerable<ViewDataUploadFilesResult>
Затем в вашем действии вы вызываете просмотр списка вместо одного результата:
View(r);
И ваше действие ViewAnswer не должно принимать никаких параметров, если вы не хотите, чтобы люди передавали параметры вашей процедуре.