【问题标题】:I want to save image to a folder in asp.net我想将图像保存到 asp.net 中的文件夹
【发布时间】:2019-02-07 07:21:06
【问题描述】:

好的,所以我的问题很简单,但我不明白为什么数据库不接受我的表单,即使我为我正确设置了所有内容。

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

解决方案 -- 所以我在模型创建阶段犯了错误,因为我在属性“urlFotografije”中放置了所需的验证 - 这不是必需的,因为每次表单都会报告为空,因为它的值没有传递。

控制器 -

[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>

【问题讨论】:

  • “它说属性 urlFotografije 等于 null” - 我不清楚你在描述什么问题。这个值具体在哪里等于null?您在代码中设置了大约一半的值,是在它之前还是之后它是null?这个字段在数据库中存储为null 的问题是什么?或者文件根本没有被保存? (后者似乎与该领域没有任何关系。)问题不清楚。
  • 程序直接返回视图(汽车); - 它进入这个方法创建,没有通过验证,因为该属性 urlFotografije = null 并返回视图 - 我想要这样的东西 - stackoverflow.com/questions/20825119/…
  • 什么是失败的验证规则?如果模型无效,则模型无效。您要么删除验证要求,要么修复使其无效的任何问题。该字段是否在模型上标记为必填项?如果需要,您期望它的价值来自哪里?
  • 它在模型上被标记为必需,我期待它来自 cshtml 上的输入,因为我在方法中设置了与参数名称相同的名称,我在最后分配了 - automobil.urlFotografije = 图像名称; -- 对不起,如果我把这些东西格式化错了
  • “我期待它来自 cshtml 上的输入” - 哪个输入?我在您的视图中没有看到任何名为“urlFotografije”的输入。所以我想不清楚你为什么期望视图为该字段发送一个值。

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


【解决方案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 中的信息采取行动,包括记录它或提供更有用的错误消息。

【讨论】:

  • 感谢您的回答 - 我需要有人像这样解释我,因为这是我在 ASP.NET MVC 中为客户做的第一个项目。第二个选项是关键,因为从模型表单中删除必需的验证不再在提交期间请求它。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多