Загрузка файлов с помощью MVC 3 - PullRequest
2 голосов
/ 19 сентября 2011

Я худею, изучая mvc3.В моем контроллере есть следующий код

    [HttpPost]
    public ActionResult Accreditation(Accreditation accreditation)
    {
        if (ModelState.IsValid)
        {
            var fileUpload = Request.Files[0];
            var uploadPath = Server.MapPath("~/App_Data/uploads");

            using (var fs = new FileStream(Path.Combine(uploadPath, accreditation.PressCard.ToString()), FileMode.Create))
            {
                var buffer = new byte[fileUpload.InputStream.Length];
                fileUpload.InputStream.Read(buffer, 0, buffer.Length);

                fs.Write(buffer, 0, buffer.Length);
            }

            context.Accreditations.Add(accreditation);
            context.SaveChanges();

            return RedirectToAction("Index");  
        }


           ViewBag.PossibleNationalities = context.Nationalities;
            ViewBag.PossibleNchis = context.Nchis;
            ViewBag.PossibleMedia = context.Media;
            ViewBag.PossibleEmploymentStatus = context.EmploymentStatus;
            return View(accreditation);



    }
}

Вот вид:

@using (Html.BeginForm("Accreditation", "Home", new { enctype = "multipart/form-data" },    FormMethod.Post))
{
   @Html.ValidationSummary(true)
.............
.............

<div class="editor-field">
       <input type="file" name="PressCard" id="PressCard" data-val-required="Press card is required" data-val="true"/>
         @Html.ValidationMessageFor(model => model.PressCard)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Passport)
    </div>
    <div class="editor-field">
       <input type="file" name="Passport" id="Passport" data-val-required="ID/Passport is required" data-val="true"/>
        @Html.ValidationMessageFor(model => model.Passport)
    </div>

....... ........

При попытке загрузки выдается следующее сообщение об ошибке:

Сведения об исключении: System.ArgumentOutOfRangeException: индекс находится вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: индекс

Кто-нибудь там с указателем в правильном направлении?


извините за задержку.Вот новый код

[HttpPost]
public ActionResult Accreditation(Accreditation accreditation, HttpPostedFileBase Passport)
    {
        if (ModelState.IsValid)
        {
            var uploadPath = Server.MapPath("~/App_Data/uploads");

            using (var fs = new FileStream(Path.Combine(uploadPath, accreditation.PressCard.ToString()), FileMode.Create))
            {
                var buffer = new byte[Passport.InputStream.Length];
                Passport.InputStream.Read(buffer, 0, buffer.Length);

                fs.Write(buffer, 0, buffer.Length);
            }

            context.Accreditations.Add(accreditation);
            context.SaveChanges();

            return RedirectToAction("Index");  
        }


           ViewBag.PossibleNationalities = context.Nationalities;
            ViewBag.PossibleNchis = context.Nchis;
            ViewBag.PossibleMedia = context.Media;
            ViewBag.PossibleEmploymentStatus = context.EmploymentStatus;
            return View(accreditation);



    }
}

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011

Действительно загружать данные? Я бы посоветовал вам использовать этот способ. Создайте параметр типа HttpPostedFileBase с с тем же именем в качестве поля ввода и проверьте его свойство длины содержимого.

Не забудьте использовать одно и то же имя для параметра и входного тега.

Если вы перейдете по этой ссылке, вы сможете двигаться быстрее.

Загрузка файла MVC 3 и привязка модели

1 голос
/ 19 сентября 2011

var fileUpload = Request.Files[0]; это линия, где у вас есть исключение, не так ли?Вы должны ожидать, что файл будет храниться в свойстве класса Accreditation, а не в Request.Files.

Так что вам нужны свойства PressCard и Passport в Accreditation, оба типа HttpPostedFileBase, а затем используйте эти свойства в своем коде.

1 голос
/ 19 сентября 2011

Получите ваш опубликованный файл непосредственно в действии:

Здесь обсуждается SO: Загрузка файла MVC 3 и привязка модели

[HttpPost]
public ActionResult Accreditation(Accreditation accreditation, HttpPostedFileBase Passport)
{
    ...
}
...