Проблема загрузки файла / ошибка в MVC 3 - PullRequest
0 голосов
/ 12 сентября 2011

У меня самая странная проблема с загрузкой файлов в ASP.NET MVC 3. Когда я запускаю новый проект с шаблоном проекта по умолчанию (интернет-приложение) с помощью Razor и добавляю следующее в /views/home/index.cshtml

<form action="/Home/Index" method="post" enctype="multipart/form-data">
  <input type="file" name="upfile" />
  <input type="submit" value="post" />
</form>

загрузка завершается неудачно (firebug показывает статус 'Aborted') всякий раз, когда я пытаюсь загрузить файл. Некоторая дополнительная информация:

  • Windows 7 / 64bit
  • Кассини
  • VS SP1
  • Это происходит как в Firebug 6.0.2, так и в IE8

Код контроллера:

public class HomeController : Controller {
    public ActionResult Index() {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About() {
        return View();
    }

}

Я немного отлаживал это и уже обнаружил следующее:

  • это происходит только для файлов> ~ 120kb
  • если я добавлю целевое действие с атрибутом [HttpPost], загрузка будет успешной
  • если я отлаживаю с помощью fiddler (proxy), загрузка удастся
  • если я использую aspx и добавляю тот же код, загрузка завершится
  • для aspx / razor, все файлы идентичны, за исключением (конечно) файлов в / Views, но не /Views/Web.config

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

обновление: Я знаю, что должен использовать отдельное действие и пометить его с помощью HttpPost, поэтому я не задаю этот вопрос. Я ищу причину , почему это не работает, а не как ее решить.

Ответы [ 3 ]

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

Не видя ваш код, я предполагаю, что у вас есть метод для HttpGet по умолчанию / home / index

Вам нужно опубликовать это где-нибудь, и это не будет вашим методом контроллера. У вас должен быть отдельный метод с [HttpPost] (отдельные методы контроллера для post / get / update / delete)

РЕДАКТИРОВАТЬ для уточнения: Создайте отдельный метод для вашей публикации действий. Вы не должны использовать один и тот же метод для получения / публикации. Также вы возвращаете представление из своего поста. Это также, как правило, не рекомендуется, поскольку MVC ожидает поведение PRG (получение после перенаправления), поэтому в идеале вы хотите перенаправить обратно к действию после завершения. Использование Post также поддерживается здесь (как и многие другие публикации в сети)

Загрузка файла MVC

В приведенном выше случае он будет работать нормально как простой без проверок, но если у вас есть проверки на странице до загрузки файла, вещи могут легко стать глупыми, если вы отправите ответ и не перенаправите обратно к действию.

0 голосов
/ 13 сентября 2011

Убедитесь, что MaxRequestStringLength правильно установлен в Web.config?

Это обычно проблема, когда я сталкиваюсь с этим.

0 голосов
/ 13 сентября 2011

Настоятельно рекомендуется отдельное действие для загрузки файла:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(HttpPostedFileBase upfile)
    {
        // TODO: process the uploaded file here
        if (upfile != null && upfile.ContentLength > 0) 
        {
            var fileName = Path.GetFileName(upfile.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
            upfile.SaveAs(path);
        }
        return RedirectToAction("Index");
    }
}

Также убедитесь, что вы заказываете следующую запись в блоге .

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