ASP.NET MVC2 загрузка файла (класс HttpPostedFileBase)

#asp.net-mvc-2 #file-upload #httppostedfilebase

#asp.net-mvc-2 #загрузка файла #httppostedfilebase

Вопрос:

У меня проблема с загрузкой моего файла. Я хочу загрузить его из моего представления редактирования:

     <% 
    using (Html.BeginForm("edit","profile",FormMethod.Post, new { enctype="multipart/form-data" }))
    {%>
    <%: Html.ValidationSummary(true) %>

    <%: ViewData["ErrorMessage"] %>
    <fieldset>
        <legend>Fields</legend>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Image) %>
        </div>
        <div class="editor-field">
            <input type="file" id="Image" name="Image" />
            <label id="LabelErrorImage" class="errorMessage" />
        </div> 

        <p>
            <input type="submit" value="Save" onclick="return Validate(); return false;"/>
        </p>
    </fieldset>

<% } %>
  

Я хочу использовать класс HttpPostedFileBase. Мое действие по редактированию:

 [Authorize]
        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(string id, HttpPostedFileBase file, FormCollection formValues)
        {
                    if (ModelState.IsValid)
                    {

                        if (file != null amp;amp; file.ContentLength > 0)
                        {
                            CustomHelpers.createFolder();
                            var tmpPath = MyConfig.UPLOAD_FILE_PATH   "/"   Membership.GetUser().ProviderUserKey.ToString();
                            var path = Path.Combine(Server.MapPath(MyConfig.UPLOAD_FILE_PATH), "Avatar");
                            var fileExtension = Path.GetExtension(file.FileName);
                            file.SaveAs(path);
                            user.Image = "Avatar";
                        }
                        adventureDB.SaveChanges();

                        return RedirectToAction("Index");
                    }
        }
  

Но у меня всегда есть пустой файловый объект, почему????? Есть ли у вас какие-либо идеи, предложения, почему это может так работать? Может быть, проблема в том, как я передаю значение файла в действие редактирования?


Редактировать:ЭТО ДЕЙСТВИТЕЛЬНО СТРАННО, ТАК КАК ДАЖЕ КОГДА я УДАЛЯЮ
using (Html.BeginForm("Index","Profile",FormMethod.Get, new { enctype="multipart/form-data" }))

Источник страницы по-прежнему имеет:

 <body>

    <form method="post" action="6111e591-b92d-4bcb-b214-ab8f664b35f9" id="form1">
  

Я имею в виду, что я не могу изменить тег, но понятия не имею, почему :/

Ответ №1:

Попробуйте изменить:-

 public ActionResult Edit(string id, HttpPostedFileBase file, 
  FormCollection formValues)
  

Для:-

 public ActionResult Edit(string id, HttpPostedFileBase image, 
  FormCollection formValues)
  

поскольку имя вашего ввода равно image

  <input type="file" id="Image" name="Image" />
  

Редактировать
Честно говоря, что-то еще останавливает привязку изображения. Это вся форма, которую вы опубликовали?

Несколько вещей для тестирования

  1. В вашем методе дважды указан HTTPOST, хотя я не думаю, что это должно что-то изменить.
  2. Просмотрите исходный код и убедитесь, что в исходном коде больше ничего не названо name=image .
  3. Перед повторным тестированием убедитесь, что вы очистили свой кэш и указали правильный исходный код
  4. Попробуйте использовать <form action="/profile/index" method="post" enctype="multipart/form-data">
  5. Судя по вашей последней правке, у вас проблема с основными страницами / макетом? Является ли это гибридом mvc / webforms?

Комментарии:

1. Да, верно, я изменил его, но он по-прежнему имеет значение null :/

2. Нет, это не весь код, поскольку он очень длинный, но я заметил, что не имеет значения, что я пишу, на мой взгляд, поскольку всегда перенаправляется на ту же функцию. Может быть, потому, что я использую главный сайт, а он использует механизм, которого я не знаю?

3. Кроме того, у меня есть еще 2 формы в исходном коде: <метод формы= «post» action =»6111e591-b92d-4bcb-b214-ab8f664b35f9″ id =»form1″> <класс div =»aspNetHidden»> <тип ввода = «скрытый» name =»__VIEWSTATE» id =»__VIEWSTATE» value =»/ wEPDwUJMjIyODQ4MTE2ZGQ0zXwQxrpoQd by EOC4qY3mQAo7zW2FgvbThGQUWMVQ==» /></div> и затем второй, который я написал в view: <действие формы =»/Profile/Edit» enctype=»multipart /form-data» метод =»POST»>

4. Да, я нашел ошибку!!!! В главном. Сайт по умолчанию создает форму, и вложенных форм быть не может, так как вторая игнорируется! Я потерял так много времени, чтобы это выяснить! Спасибо за помощь!

5. Не беспокойтесь, возможно, вы могли бы отметить этот вопрос как ответ, спасибо

Ответ №2:

Решение этой проблемы, когда:

  1. Мы используем Master.Сайт,
  2. Мы хотим загрузить файл в виде,
  3. Мы уверены, что это должно сработать, но у нас все время есть null,

Затем:

  1. Ребята были правы — на мой взгляд, у меня было неправильное имя — проверьте это!
  2. Проверьте исходный код вашего представления, и если у вас есть 2 тега < form>, вам следует удалить тег < form> с основного сайта, так как тогда второй игнорируется!

Теперь это должно сработать.

Ответ №3:

Что ж, на ваш взгляд, вы назвали входной файл ‘image’, но ваш метод action принимает параметр с именем ‘file’. Переименуйте один из них, и он должен работать.

Комментарии:

1. Да, но я изменил его сейчас и все тот же :/