C# 没有选定文件的MVC4表单输入正在删除数据库图像字段内容

C# 没有选定文件的MVC4表单输入正在删除数据库图像字段内容,c#,html,asp.net-mvc-4,C#,Html,Asp.net Mvc 4,需要帮助,因为我不熟悉web开发和MVC技术 问题详情: 我有一个叫做“档案”的视图,显示了一个人的详细信息。 加载视图时,将从数据库中正确显示图像。 如果我更改表单中的任何字段(例如:name),然后单击“保存”按钮提交表单,则图像将被发送为空,这将用空值覆盖数据库图像字段。 请注意,如果单击该图像,将显示“打开”对话框窗体,并且在选择有效图像后,该图像将成功上载到数据库 我很困惑,因为我正在寻找所有类似的职位,因为3天前张贴在这里 我在控制器上的Get和Post方法: [HttpGe

需要帮助,因为我不熟悉web开发和MVC技术

问题详情: 我有一个叫做“档案”的视图,显示了一个人的详细信息。 加载视图时,将从数据库中正确显示图像。 如果我更改表单中的任何字段(例如:name),然后单击“保存”按钮提交表单,则图像将被发送为空,这将用空值覆盖数据库图像字段。 请注意,如果单击该图像,将显示“打开”对话框窗体,并且在选择有效图像后,该图像将成功上载到数据库

我很困惑,因为我正在寻找所有类似的职位,因为3天前张贴在这里

我在控制器上的Get和Post方法:

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