Загрузить файл в ASP.NET MVC (снова!) - PullRequest
3 голосов
/ 12 апреля 2011

У меня проблема с загрузкой файла в asp.net mvc 2. Параметр функции моего контроллера имеет тип FormCollection. Поскольку полей слишком много, я не могу разделить каждое поле как параметр. У меня есть 2 поля для загрузки файла в моей форме. Как я могу загрузить загруженные файлы в мой контроллер?

Я пробовал так:

public ActionResult CreateAgent(FormCollection collection, HttpPostedFileBase personImage)
{
    ...
}

, но personImage было null. (

или так:

HttpPostedFileBase img = this.HttpContext.Request.Files[collection["personImage"]];

но img был null до. Также collection["personImage"] было именем выбранного файла (без пути), и я не могу привести его к HttpPostedFileBase.

Обратите внимание, что все поля должны быть заполнены на одной странице. Я не могу позволить клиенту загружать изображения на отдельной странице!

Ответы [ 2 ]

9 голосов
/ 12 апреля 2011

Начните с чтения этой записи в блоге . Затем примените его к вашему сценарию:

<form action="/Home/CreateAgent" method="post" enctype="multipart/form-data">

    <input type="file" name="file1" id="file" />
    <input type="file" name="file2" id="file" />

    ... Some other input fields for which we don't care at the moment
        and for which you definetely should create a view model
        instead of using FormCollection in your controller action

    <input type="submit" />
</form>

в переводе на язык WebForms дает:

<% using (Html.BeginForm("CreateAgent", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>
    <input type="file" name="file1" id="file" />
    <input type="file" name="file2" id="file" />

    ... Some other input fields for which we don't care at the moment
        and for which you definetely should create a view model
        instead of using FormCollection in your controller action

    <input type="submit" />
<% } %>

и затем:

public ActionResult CreateAgent(
    // TODO: To be replaced by a strongly typed view model as the 
    // ugliness of FormCollection is indescribable
    FormCollection collection, 
    HttpPostedFileBase file1, 
    HttpPostedFileBase file2
)
{
    // use file1 and file2 here which are the names of the corresponding
    // form input fields
}

Если у вас много файлов, тогда используйте IEnumerable<HttpPostedFileBase>, как показано Haacked.

Примечания:

  • Абсолютно никогда не используйте this.HttpContext.Request.Files в приложении ASP.NET MVC
  • Абсолютно никогда, никогда не используйте this.HttpContext.Request.Files[collection["personImage"]] в приложении ASP.NET MVC.
2 голосов
/ 12 апреля 2011

Как выглядит ваше заявление об использовании для вашей формы?Это должно выглядеть примерно так:

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