C# 没有选定文件的MVC4表单输入正在删除数据库图像字段内容
需要帮助,因为我不熟悉web开发和MVC技术 问题详情: 我有一个叫做“档案”的视图,显示了一个人的详细信息。 加载视图时,将从数据库中正确显示图像。 如果我更改表单中的任何字段(例如:name),然后单击“保存”按钮提交表单,则图像将被发送为空,这将用空值覆盖数据库图像字段。 请注意,如果单击该图像,将显示“打开”对话框窗体,并且在选择有效图像后,该图像将成功上载到数据库 我很困惑,因为我正在寻找所有类似的职位,因为3天前张贴在这里 我在控制器上的Get和Post方法:C# 没有选定文件的MVC4表单输入正在删除数据库图像字段内容,c#,html,asp.net-mvc-4,C#,Html,Asp.net Mvc 4,需要帮助,因为我不熟悉web开发和MVC技术 问题详情: 我有一个叫做“档案”的视图,显示了一个人的详细信息。 加载视图时,将从数据库中正确显示图像。 如果我更改表单中的任何字段(例如:name),然后单击“保存”按钮提交表单,则图像将被发送为空,这将用空值覆盖数据库图像字段。 请注意,如果单击该图像,将显示“打开”对话框窗体,并且在选择有效图像后,该图像将成功上载到数据库 我很困惑,因为我正在寻找所有类似的职位,因为3天前张贴在这里 我在控制器上的Get和Post方法: [HttpGe
[HttpGet]
public ActionResult Dossier(string myPatientId)
{
Patient patient;
using (var ctx = new MedikEntities())
{
patient = ctx.Patients.FirstOrDefault(p => p.PatientId == myPatientId);
}
// check if not null
if (patient == null)
return RedirectToAction("List");
return View(patient);
}
[HttpPost]
public ActionResult Dossier(Patient patient, HttpPostedFileBase photo)
{
if (!ModelState.IsValid)
return View(patient);
if (photo != null)
{
patient.ImageMimeType = photo.ContentType;
patient.PatientPicture = new byte[photo.ContentLength];
photo.InputStream.Read(patient.PatientPicture, 0, photo.ContentLength);
}
using (var ctx = new MedikEntities())
{
// register the patient
ctx.Patients.Attach(patient);
// set entity as changed
ctx.Entry(patient).State = EntityState.Modified;
// commit changes
ctx.SaveChanges();
}
return View(patient);
}
视图:
@using (Html.BeginForm("Dossier", "Patient", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
<input type="submit" class="btn btn-primary" value="Enregistrer" />
</p>
<div class="box box-info-male">
<div>
<p style="float: left;">
<img class="photoPatient"
src="@Url.Action("GetImage", "Patient", new { Model.PatientId })"
alt="@Model.PatientPicture"
id="myPhoto"
style="cursor: pointer"
/>
</p>
<input type="file" name="photo" id="photo" style="display: none" />
经过数小时的调试,我终于找到了解决问题的方法 记住用于显示图像的代码:
public FileContentResult GetImage(string patientId)
{
using (var ctx = new MedikEntities())
{
var patient = ctx.Patients.FirstOrDefault(p => p.PatientId == patientId);
return patient != null ? File(patient.PatientPicture, patient.ImageMimeType) : null;
}
}
文件调用(patient.PatientPicture、patient.ImageMimeType)就是问题所在。我发现,如果用户不选择文件,则发送到表单的Mime类型为NULL。然后,我的模型将图片字段也设置为Null
因此,作为解决方案,我更改了第二个方法参数,如下所示,以强制类型为image:
return patient != null ? File(patient.PatientPicture, "image/jpeg") : null;
经过多次测试,所有案例都给出了正确的结果,现在,如果用户选择一个文件,它将正确加载,显示在页面上,然后保存到数据库中。如果用户再次加载表单,则正确显示图像,如果更改了任何字段而未选择新的提交文件,则旧图片仍然存在,并且图片的数据库字段不为空
也许有人能更详细地向我解释一下,我只是按照我的逻辑得到了它你在哪里设置了mime类型?它也在数据库字段中,同一个表中。有关信息,我只是按照书中的SportsStore示例:Pro ASP.NET MVC 4进行了仔细检查。您的代码返回null如果患者为null,您是否验证了返回的内容?你检查过mime类型是否被正确发送了吗?@MikeCheel,我使用调试程序跟踪发布的值。所有字段都正确地发布到模型中,只有PatientPicture字段为空…发布到数据库中的MIME字段也为空,但您是否返回实际文件或空值?当您在chrome调试器中查看文件的关闭内容时,MIME类型是什么?
return patient != null ? File(patient.PatientPicture, "image/jpeg") : null;