我想将图像保存到asp.net中的文件夹

时间:2019-02-06 18:52:36

标签: c# asp.net model-view-controller

好吧,我的问题很简单,但是即使我为我正确设置了所有内容,我也看不出为什么数据库不接受我的表格。

我想问你,为什么控制器不想将图像保存到我的项目的文件夹中?我尝试了调试,并说该属性urlFotografije等于null。

解决方案- 所以我在模型创建阶段出错了,因为我在属性“ 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 :(得分:1)

根据对上述问题的冗长评论,在调试中观察到的问题与保存文件或写入数据库无关。根据您的调试,只是跳过了整个代码块,因为这是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中的信息并对其采取行动,包括对其进行记录或提供更有用的错误消息。