Я хочу сохранить изображение в папку в asp.net - PullRequest
0 голосов
/ 06 февраля 2019

Хорошо, поэтому моя проблема довольно проста, но я не понимаю, почему база данных не принимает мою форму, даже если я для меня все настроил правильно.

Я хотел бы спросить вас, почему контроллер делаетне хотите сохранить изображение в папку на моем проекте?Я попытался с отладкой, и он говорит, что свойство urlFotografije равно нулю.

РЕШЕНИЕ - Итак, я допустил ошибку во время фазы создания модели, так как я поставил обязательную проверку в свойстве "urlFotografije" - это не требуетсяпоскольку каждый раз, когда форма будет сообщать, будет иметь значение NULL, поскольку ее значение не передается.

Контроллер -

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "AutomobilId,Marka,Model,ZapreminaMotora,Snaga,Gorivo,Karoserija,urlFotografije,Opis,Cena,Kontakt")] Automobil automobil, 
        HttpPostedFileBase file)
    {
        if (file != null)
        {
           ModelState.AddModelError("file", "niste odabrali sliku");
        }

        if (ModelState.IsValid)
        {
            string imageName = System.IO.Path.GetFileName(file.FileName);
            string putanja = Server.MapPath("/Images/"+ imageName);

            file.SaveAs(putanja);
            automobil.urlFotografije = imageName;


            try
            {
                db.Automobili.Add(automobil);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            catch (Exception)
            {
                ViewBag.Greska = "Greska pri cuvanju podataka";
            }
        }

        return View(automobil);
    }

Просмотр -

@model WebProdajaAutomobila.Models.Automobil

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>


<form action="/Automobil/Create" method="post" enctype="multipart/form-data">
@Html.AntiForgeryToken()
<div class="form-horizontal">
    <h4>Automobil</h4>
    <hr />

    <div class="form-group">
        <label class="control-label col-md-2" for="Marka">Marka</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-length="Max 30 karaktera" data-val-length-max="30" data-val-required="Unesite marku vozila" id="Marka" name="Marka" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Marka" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Model">Model</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-length="Max 30 karaktera" data-val-length-max="30" data-val-required="Unesite model vozila" id="Model" name="Model" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Model" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="ZapreminaMotora">ZapreminaMotora</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-number="The field ZapreminaMotora must be a number." data-val-required="Unesite zapreminu motora" id="ZapreminaMotora" name="ZapreminaMotora" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="ZapreminaMotora" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Snaga">Snaga</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-number="The field Snaga must be a number." data-val-required="Unesite snagu motora" id="Snaga" name="Snaga" type="number" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Snaga" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Gorivo">Gorivo</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-length="Max 20 karaktera" data-val-length-max="20" data-val-required="Unesite gorivo vozila" id="Gorivo" name="Gorivo" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Gorivo" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Karoserija">Karoserija</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-length="Max 30 karaktera" data-val-length-max="30" data-val-required="Unesite karoseriju vozila" id="Karoserija" name="Karoserija" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Karoserija" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2">Odaberi sliku</label>
        <div class="col-md-10">
            <input id="File1" type="file" name="file"/>
        </div> 
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Opis">Opis</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-length="Max 100 karaktera" data-val-length-max="100" data-val-required="Unesite opis vozila" id="Opis" name="Opis" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Opis" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Cena">Cena</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-number="The field Cena must be a number." data-val-required="Unesite cijenu" id="Cena" name="Cena" type="text" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Cena" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <label class="control-label col-md-2" for="Kontakt">Kontakt</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" data-val="true" data-val-number="The field Kontakt must be a number." data-val-required="Unesite kontakt" id="Kontakt" name="Kontakt" type="number" value="" />
            <span class="field-validation-valid text-danger" data-valmsg-for="Kontakt" data-valmsg-replace="true"></span>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>

1 Ответ

0 голосов
/ 06 февраля 2019

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

if (ModelState.IsValid)

Это просто сводится к правилам проверки, определенным в вашей модели (Automobil), и к каким значениямВаша форма переходит к действию контроллера.Согласно этой ветке комментариев, поле urlFotografije помечено как Required в вашей модели.

Но это поле нигде не найти в форме в вашем представлении.Поскольку форма не публикует значение для этого поля, поле не имеет значения.Поскольку это обязательное поле, модель недопустима, а остальная часть кода не выполняется.

У вас есть несколько вариантов:

  1. Укажите значение для поля.Это будет означать добавление еще одной input к вашей форме с именем urlFotografije и указание значения в этом input перед отправкой формы.
  2. Сделайте поле не обязательным.Это просто означает удаление правила проверки Required в модели.Тогда вашей форме не нужно будет указывать значение для этого поля.
  3. Не проверяйте правильность модели перед выполнением кода.Возможно, это не идеально, но в некоторых случаях это не имеет значения.
  4. Переставьте логику, чтобы вы могли вручную заполнить значение перед проверкой валидации модели.

На основе вашегокод, похоже, вариант 4, скорее всего, путь.Вы вручную указываете значение в этом поле, но делаете это после , когда вы проверили состояние модели.Переверните это.Возможно, что-то вроде этого:

string imageName = System.IO.Path.GetFileName(file.FileName);
string putanja = Server.MapPath("/Images/"+ imageName);
automobil.urlFotografije = imageName;

if (ModelState.IsValid)
{
    file.SaveAs(putanja);

    try
    {
        db.Automobili.Add(automobil);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch (Exception)
    {
        ViewBag.Greska = "Greska pri cuvanju podataka";
    }
}

Обратите внимание, как определяются вычисленные значения и это свойство заполняется за до проверки состояния проверки модели.Затем, если модель верна, выполняется остальная часть кода, который фактически записывает данные в файловую систему и базу данных.

Примечание: Ваш блок catch игнорирует ценную информацию обо всех возникающих исключениях.Когда вы перехватываете исключение, перехватываете его в переменную:

catch (Exception ex)

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

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