С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Eulu
0 / 0 / 0
Регистрация: 15.11.2018
Сообщений: 2
1

Отправка модели товара и изображения

16.11.2018, 01:25. Просмотров 845. Ответов 3
Метки нет (Все метки)

Здравствуйте! Мне в учебных целях нужно написать сайт, на котором можно будет продавать вещи, давая объявления.

У меня есть поля с названием и описанием. Также я хочу сделать возможность прикреплять фотографию товара в объявление.

Вот модель товара:

C#
1
2
3
4
5
6
7
public class MarketItem
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public string Photo { get; set; }
        public int UserDetails { get; set; }
    }
Скопипастил код
HTML5
1
2
3
4
5
6
7
8
9
@{
    ViewBag.Title = "Upload";
}
<h3>Выберите файл для загрузки</h3>
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new {enctype="multipart/form-data"}))
{
    <input type="file" name="upload" /><br>
    <input type="submit" value="Загрузить" />
}
и метод для загрузки изображения

C#
1
2
3
4
5
6
7
8
9
10
11
12
[HttpPost]
public ActionResult Upload(HttpPostedFileBase upload)
{
    if(upload!=null)
    {
        // получаем имя файла
        string fileName = System.IO.Path.GetFileName(upload.FileName);
        // сохраняем файл в папку Files в проекте
        upload.SaveAs(Server.MapPath("~/Files/" + fileName));
    }
    return RedirectToAction("Index");
}
Также есть мой метод в контроллере для создания объявления


C#
1
2
3
4
5
6
7
8
9
10
11
12
[HttpGet]
        public ActionResult AddLot()
        {
            return View("AddLot");
        }
 
 [HttpPost]
        public ActionResult AddLot(MarketItem TempItem)
        {
            ViewBag.Yes = "Yes";
            return View("Main");
        }
Но я думаю, что при нажатии на кнопку "Загрузить изображение"
HTML5
1
<input type="submit" value="Загрузить" />
срабатывает submit и форма отправляется на action Upload, а не на AddLot, верно?

Как я могу совместить эти два метода?
Мне нужно чтобы при нажатии на кнопку "Добавить объявление" изображение загрузилось на сервер, а поля, которые зполнил пользователь поместились в базу.
Асинхронность?

Буду рад за помощь или обьяснение ,если я чего-то не понимаю.
Спасибо!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2018, 01:25
Ответы с готовыми решениями:

Элемент модели, переданный в словарь, имеет тип "Int32", но для этого словаря требуется элемент модели типа "Calc"
Текст ошибки: System.InvalidOperationException: Элемент модели, переданный в словарь, имеет тип...

Вывести количество товара первой модели, вывезенного за 5 дней
Помогите выполнить кому не труд заранее спасибо. Задание: На складе электроники имеются запасы 10...

Отправка формы после оплаты товара
Здравствуйте! Сайт на drupal 6 ubercart 2. Продаю готовые файлы, загруженные на сервер. Тут все...

Выбор товара из списка и отправка на e-mail
Добрый день. Заранее извиняюсь, если подобный вопрос уже задавали. В общем, задача такая. Есть...

Автоматическая отправка товара на майл после покупки?
Добрый вечер. Я битмейкер, есть идея сделать инт.магазин по покупке битов. К примеру человек...

3
HF
151 / 149 / 48
Регистрация: 09.09.2011
Сообщений: 528
Завершенные тесты: 18
16.11.2018, 11:14 2
А что вам помешало input.file засунуть в форму лота?
Если вы не будете использовать прямо в модели изображение, то добавляете ещё параметр в экшен
C#
1
AddLot(MarketItem TempItem, HttpPostedFileBase upload)
и обрабатываете его дополнительно
1
Eulu
0 / 0 / 0
Регистрация: 15.11.2018
Сообщений: 2
17.11.2018, 19:54  [ТС] 3
Моя форма выглядит таким образом:

HTML5
1
2
3
4
5
<form>
      <input class="form-control form-control-lg" type="text" placeholder=".form-control-lg" value="@Model.Name">
      <textarea class="form-control" id="exampleFormControlTextarea1" rows="3" value="@Model.Name"></textarea>
       <input type="file" name="upload" /><br>
<input type="submit" value="Add Lot" />
Должен вызваться мой экшн, верно?

Но если нажать F12 перед тем, как отправить форму лота, то почему-то вызывается Get метод.

Мои экшены:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[HttpGet]
        public ActionResult AddLot()
        {
            return View("AddLot");
        }
 
[HttpPost]
        public ActionResult AddLot(MarketItem TempItem, HttpPostedFileBase upload)
        {
            if (upload != null)
            {
                string fileName = System.IO.Path.GetFileName(upload.FileName);
                upload.SaveAs(Server.MapPath("~/Files/" + fileName));
            }
            return View("Main");
        }
В чём может быть проблема и почему не срабатывает Post метод?
Спасибо!

Добавлено через 41 минуту
Ещё не могу понять момент:

Мы убрали строку

C#
1
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new {enctype="multipart/form-data"}))
Что поменялось?

"Upload", "Home" - они должны были указать на контроллер и метод. Теперь будет использоваться наш метод?

FormMethod.Post - как сервер знает что нужно выбрать метод Post? Из-за наличия модели и входящих параметров?

new {enctype="multipart/form-data"}) - параметр, который отвечает за загрузку нескольких файлов?

Нужно ли переписать как-то эти параметры? Или мой контроллер сам поймёт что к чему?
0
HF
151 / 149 / 48
Регистрация: 09.09.2011
Сообщений: 528
Завершенные тесты: 18
17.11.2018, 22:20 4
Лучший ответ Сообщение было отмечено Eulu как решение

Решение

Я не ожидал что вы выберите такой вариант. Чистый JS и MVC. Ну странно, я б так не сделал.

1) У вас не весь код для примера. Сейчас я начал сомневаться - а у вас работал ранее AddLot без файла? видимо нет.
2) Собственно вы уже сами видите разницу. Осталось изучить основы и сделать выводы.

Цитата Сообщение от Eulu Посмотреть сообщение
В чём может быть проблема и почему не срабатывает Post метод?
Потому что вы убрали настройки у формы и вызывается метод по умолчанию - GET.

Цитата Сообщение от Eulu Посмотреть сообщение
"Upload", "Home" - они должны были указать на контроллер и метод. Теперь будет использоваться наш метод?
Конечно. Почему бы не использовать MVC хелпер со всеми настройками.
Только поменять нужно на правильный метод. Upload же у вас только файл принимает, а вам нужно передать всю форму с данными ещё.

Цитата Сообщение от Eulu Посмотреть сообщение
FormMethod.Post - как сервер знает что нужно выбрать метод Post? Из-за наличия модели и входящих параметров?
"Глупый вопрос, глупый ответ". Если мы ему скажем какой метод использовать - он так и сделает.

Цитата Сообщение от Eulu Посмотреть сообщение
new {enctype="multipart/form-data"}) - параметр, который отвечает за загрузку нескольких файлов?
Да. Эту настройку надо обязательно иметь при передаче формы с данными типа "файл".

Цитата Сообщение от Eulu Посмотреть сообщение
Нужно ли переписать как-то эти параметры? Или мой контроллер сам поймёт что к чему?
1) верните вариант формы через MVC. То что у вас называется "Скопипастил код"
2) поменяйте экшен с Upload на AddLot
3) добавьте в форму поля из модели "MarketItem"
3.1) в примере они у вас неправильно сделаны. Ничего не передастся. Изучите теорию, найдите примеры с input.ами. Иначе придётся тут расписывать детально основы.

Примерный набросок для создания нового лота:
Javascript
1
2
3
4
5
6
7
8
@using (Html.BeginForm("AddLot", "Home", FormMethod.Post, new {enctype="multipart/form-data"}))
{
    <input class="form-control form-control-lg" type="text" name="Name" placeholder="Имя лота" ><br>
    <input class="form-control form-control-lg" type="text" name="Description" placeholder="Описание" ><br>
    <input type="file" name="upload" /><br>
 
    <input type="submit" value="Загрузить" />
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2018, 22:20

Вывод изображения в карточке товара
Надо чтобы изображение октрнывалось не на другой странице, а на этой же и в каком-то модальном...

Смена главного изображения товара
Доброго времени суток! В карточке товара выводятся дополнительные фото (MORE_PHOTO) под главным...

Опишите класса товара. Поля класса: имя товара, цена товара, количество товара на склад
Опишите класса товара. Поля класса: имя товара, цена товара, количество товара на складе. Выполнить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru