簡體   English   中英

在ASP.NET MVC中發生NullReferenceException異常時在瀏覽器中創建錯誤消息

[英]Create error message in browser when NullReferenceException exception occurs in asp.net mvc

當拋出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 };
}

我最初執行以下操作,但是會發生DbNullException

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

}

好吧,簡單地說,您可以將查詢包裝在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) ...

UPDATE

您視圖中唯一可能導致異常的是: item.Member.Name 在ID不匹配的情況下, item.Member為null,並且null沒有Name屬性,因此是異常。 您可以通過執行null檢查來解決此問題:

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

然后,如果item.Member為null,則不會輸出任何內容。 否則,將輸出Name屬性的值。 無論哪種方式,您都不會再遇到異常。

您需要捕獲nullerfernce異常並將操作重定向到錯誤消息視圖操作或在同一頁面狀態上顯示錯誤

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM