好吧,我的问题很简单,但是即使我为我正确设置了所有内容,我也看不出为什么数据库不接受我的表格。
我想问你,为什么控制器不想将图像保存到我的项目的文件夹中?我尝试了调试,并说该属性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>
答案 0 :(得分:1)
根据对上述问题的冗长评论,在调试中观察到的问题与保存文件或写入数据库无关。根据您的调试,只是跳过了整个代码块,因为这是false
:
if (ModelState.IsValid)
这仅取决于模型(Automobil
)上定义的验证规则,以及您的表单将哪些值传递给控制器操作。根据该注释线程,urlFotografije
字段在模型中被标记为Required
。
但是您现在可以在表单中的该字段中找到该字段。由于表单没有为该字段发布值,因此该字段没有值。由于这是必填字段,因此该模型无效,其余代码无法执行。
您基本上有几种选择:
input
名称urlFotografije
,并在发布表单之前在其中input
中添加一个值。Required
验证规则。这样,您的表单就无需为该字段提供值。根据您的代码,看来选项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
中的信息并对其采取行动,包括对其进行记录或提供更有用的错误消息。