Ошибка загрузки файла с использованием цикла foreach. «... не содержит публичного определения для« GetEnumerator »» - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь заставить загрузчик файлов работать.Я следую учебному пособию " A Назад к основам Пример из практики: Реализация загрузки файлов HTTP с помощью ASP.NET MVC, включая тесты и макеты " , но я не использую TDD , потому что у меня мало времени, а также я относительно новичок в ASP.NET MVC.

Когда я использую приведенный пример кода (с небольшими изменениями, чтобы скорректировать разницу в контексте), я получаю следующую ошибкуat 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.

1 Ответ

3 голосов
/ 12 октября 2011

Вам необходимо, чтобы ваше представление связывалось с IEnumerable ViewDataUploadFilesResult вместо ViewDataUploadFilesResult:

IEnumerable<ViewDataUploadFilesResult>

Затем в своем действии вы вызываете View по списку, а не по одному результату:

View(r);

И ваше действие ViewAnswer не должно принимать никаких параметров, если вы не хотите, чтобы люди передавали параметры вашей подпрограмме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...