【问题标题】:Create error message in browser when NullReferenceException exception occurs in asp.net mvc在 asp.net mvc 中发生 NullReferenceException 异常时在浏览器中创建错误消息
【发布时间】:2017-08-02 16:24:27
【问题描述】:

我想创建一条错误消息,以便在抛出 DbNullException 时显示在浏览器上。

当用户输入正确的MemberId 时,就会出现正确的结果。但是,当用户输入不正确的MemberId 时,会抛出NullReferenceException

查询:

[HttpGet]
public ActionResult LoanSearch(string q)
{
        if (q == null)
        {

            throw new Exception("Enter");
        }
      else

        return PartialView(loans);

}

public List<Loan> GetLoans(string searchString)
{
    var loan = db.Loans
                 .Where(a => a.ISBN.ToString().Contains(searchString) &&
                             a.Book.OnLoan == 1)
                 .OrderByDescending(a => a.LoanId)
                 .FirstOrDefault();

    return new List<Loan> { loan };
}

我最初执行以下操作,但这是 aDbNullExceptionoccurs:

[HttpGet]
public ActionResult LoanSearch(string q, Member loanss)
{
    var loans = GetLoans(q, loanss);
    return PartialView(loans);
}

public List<Loan> GetLoans(string searchString, Member loanss)
{
    loanss.errorM = "enter correct member id";

    var loan = db.Members.Where(a => a.MemberId.ToString()
                                      .Contains(searchString) &&
                                     a.Book.OnLoan == 1)
                         .OrderByDescending(a => a.LoanId)
                         .FirstOrDefault();

    if (loan != null)
    {
        return new List<Member> { loan };
    }
    else
    {
        return new List<Member> { loanss };
    }
}

总之,我希望出现一条错误消息,而不是抛出 an exception 错误,我不知道如何实现这一点。感谢您的宝贵时间

这是我的 ajax:

div class="panel panel-default">
    <div class="panel-heading">Please enter the ISBN Number of the book</div>
    <div class="panel-body">
        @using (Ajax.BeginForm("LoanSearch", "BookReturn",
                   new AjaxOptions
                   {
                       InsertionMode = InsertionMode.Replace,
                       HttpMethod = "GET",
                       OnFailure = "searchFailed",
                       LoadingElementId = "ajax-loader",
                       UpdateTargetId = "searchresult",
                   }))
        {
            <input type="text" name="q" />
            <input type="submit" value="search" />
            <img id="ajax-loader"
                 src="@Url.Content("~/Images/ajax-loader.gif")"

            style = "display:none" />
        }
        <div id="searchresult"></div>

                   </div>
</div>

这是错误所在:在部分视图中-@item.Member.Name:

        foreach (var item in Model)
        {
            <div class="text-center">
                <br />
                <p>Member Name: @item.Member.Name</p>
                <p>Book Title: @item.Book.Name</p>
                <p>Book Author: @item.Book.Author</p>
                <p>Checkout Date: @item.CheckOutDate</p>
                <p>Return Date: @item.ReturnDate</p>
                <br />

}

【问题讨论】:

    标签: c# sql-server asp.net-mvc error-handling asp.net-ajax


    【解决方案1】:

    嗯,简单地说,您可以将查询包装在try...catch

    try
    {
        var loan = db.Members ...
    }
    catch (NullReferenceException)
    {
        ModelState.AddModelError("searchString", "Danger Will Robinson!");
    }
    

    但是,真正的问题是首先获得此异常。在这里向用户返回错误的问题在于,用户没有做任何事情来导致它,并且无能为力做任何事情来纠正它。问题是MemberId 显然可以为空,所以你应该在调用ToString() 之前检查一下:

    .Where(a => a.MemberId != null && a.MemberId.ToString().Contains(searchString) ...
    

    更新

    您认为唯一可能导致异常的是:item.Member.Name。在 id 不匹配的情况下,item.Member 为 null,并且 null 没有 Name 属性,因此出现异常。你可以通过做一个空检查来解决这个问题:

    @(item.Member != null ? item.Member.Name : null)
    

    然后,如果item.Member 为空,则不会输出任何内容。否则,将输出Name 属性的值。无论哪种方式,您都不会再遇到异常。

    【讨论】:

    • 当我实现这一点时,在 getLoans 操作方法中 - 并非所有代码都返回一个值
    • MemberId 为空的情况下,什么都不会匹​​配。也许 that 是您的问题:为什么该列首先为 null?
    • 当用户输入有效的 Memberid 时会出现正确的结果,当输入不正确的 membered 时会出现 nullreference。我希望出现一条用户可以阅读的错误消息,而不是出现 nullreference 错误
    • NullReferenceException 很可能在您看来是由于访问Member 上的某些属性而导致的,您认为这些属性具有值,但实际上并没有。这可能是因为您从数据库中返回 Member(当 id 匹配时),这将包含 Member 应该或 posted Member 的所有数据(当 id 不匹配时),这可能是因为它没有发布而丢失了一些东西。这与您的查询或数据库无关。
    • 发布实际产生异常的代码。
    【解决方案2】:

    您需要捕获 nullerfernce 异常并将操作重定向到错误消息视图操作或在同一页面状态上显示错误

     [HttpGet]
    public ActionResult LoanSearch(string q, Member loanss)
    {
    try
    {
        var loans = GetLoans(q, loanss);
        return PartialView(loans);
    }
      catch(NullReferenceException)
    { 
           return PartialView(ErrorPage);
    }
    }
    

    【讨论】:

    • LoanSearch 操作方法声明不是所有代码在实现 try 和 catch 时都返回一个值?并且变量 e 已声明但未使用
    • 您应该使用第二行省略第一行只是重定向到另一个操作(如果您使用 ajax 调用,那么这也不起作用),第二行声明但从未使用过的变量是警告不是错误只是从异常中删除变量 e
    • 谢谢,我正在使用 ajax,那么在使用 ajax 时重定向到另一个操作的替代方法是什么
    • 通常错误会在全局 asax 文件中处理(最好的方法),您只需抛出异常并在全局 asax 文件中进行编码msdn.microsoft.com/en-us/library/24395wz3.aspx
    • 但是在这里你可以做这样的事情我刚刚编辑了答案再检查一遍
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多