如何在不修改数据库的情况下绕过argumentNull异常?

时间:2017-02-11 11:14:38

标签: c# html .net asp.net-mvc entity-framework

我的模型中有一个图像属性,有时候很空。问题是,当数据库中没有图像时,我会argumentNull exception。如果记录中没有图像,我想要实现的仍然是显示其余属性。

为了达到这个目的,我在我的观点中尝试过这样的事情,但这并不起作用:

<div>
<h4>Company</h4>
<hr />
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.ImageData)
    </dt>
    @if (Model.ImageBase64 != null || Model.ImageData!= null )
    {
        <dd>

            <img src="data:image/png;base64,@Model.ImageBase64" />


        </dd>
    }
    <dt>
        @Html.DisplayNameFor(model => model.CompanyName)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.CompanyName)
    </dd>

我的模型看起来像这样:

public class Company
{
    [Key]

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int CompanyId { get; set; }
    public byte[] ImageData { get; set; }
    [NotMapped]
    public HttpPostedFileBase UploadImage { get; set; }
    [NotMapped]
    public string ImageBase64 => System.Convert.ToBase64String(ImageData);
    public string CompanyName { get; set; }
    public string CompanyAddress { get; set; }
    public string CompanyCountry { get; set; }
    public string CompanyCity { get; set; }
    public string CompanyPostalCode { get; set; }
    public string CompanyPhoneNumber { get; set; }
    public string CAId { get; set; }
    public virtual ICollection<WorkRole> WorkRoles { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}

这就是我从控制器传递给视图的内容:

Company company = db.Companies.Where(c => c.CAId == currentUserId)
                .FirstOrDefault();
        db.Users.FirstOrDefault(x => x.Id == currentUserId);

有关如何实现我想要的任何提示?

2 个答案:

答案 0 :(得分:1)

您可以执行null检查,并确保ImageData属性在视图中呈现之前有效。

if (@model.ImageData?.Length > 0) { }

您还可以更进一步,修改LINQ查询以过滤具有有效图片的公司。

 db.Companies.Where(c => c.CAId == currentUserId
                    && c.ImageBase64 != null
                    && c.ImageData?.Length > 0).FirstOrDefault();

作为补充说明,请确保将填充的模型正确传递回视图。

public ActionResult DisplayCompanyImages() 
{
    var model = // Retrieve db.Companies
    return View(model);
}

答案 1 :(得分:1)

如果您使用的是Database First,请打开Model(* .edmx文件),找到表示数据库表的实体类型,右键单击image属性,然后从上下文菜单中选择Properties。在“属性”窗口中,将Nullable从False更改为True。