【问题标题】:How to bypass an argumentNull exception without modifying the database? [duplicate]如何在不修改数据库的情况下绕过argumentNull异常? [复制]
【发布时间】:2017-02-11 11:14:37
【问题描述】:

我的模型中有一个图像属性,该属性有时可能为空。问题是当数据库中没有图像时,我得到一个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);

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

【问题讨论】:

  • 您是否将模型返回到视图 - 您显示的代码可能引发异常的唯一方法是 Modelnull
  • 是的,我要退货。
  • 那么您还没有向我们展示真正引发异常的代码。 @if (Model.ImageBase64 != null || Model.ImageData!= null ) 甚至不需要
  • 虽然我向您展示了抛出它的代码..如果不是视图或控制器,它可能是什么?抛出异常,因为字符串 ImageBase64 不可为空,我想绕过它。原谅我的菜鸟。
  • 问题不在于视图 - 它的 public string ImageBase64 =&gt; System.Convert.ToBase64String(ImageData); - ToBase64String(null) 抛出异常

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


【解决方案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);
}

【讨论】:

  • 例外不是因为ImageBase64null——而是因为Modelnull
  • 感谢您的回答。我试过了,但它给了我以下异常:LINQ to Entities does not identify the method 'Boolean IsNullOrWhiteSpace(System.String)' method, and this method cannot be translate into a store expression.
  • @RobertRoss - 我已经修改了我的答案以显示 LINQ to Entities 替换 .IsNullOfWhiteSpace
  • @StephenMuecke - OP 没有提供任何代码来显示他们返回视图的模型并声明他们有一个填充模型。我也将它作为安全检查包含在我的答案中。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多