NullReferenceException при * установке * значении в ViewBag - PullRequest
0 голосов
/ 07 марта 2012

Я нахожусь в конце моего остроумия здесь.Я продолжаю получать NullReferenceException в следующей строке кода:

  ViewBag.PaypalError = "we were unable to retreive your cart.";

Я знаю, что это та строка - я добавил некоторый код в другом месте файла, который заставил его получить новый номер строки, и номер строки вмоя ошибка изменилась, чтобы следовать за ним.Я знаю, что ViewBag не является нулевым, потому что я специально вставил тест if (ViewBag == null) перед ним.

Чтобы сделать вещи более странными, у меня есть код для отправки электронного письма, когда выполнение входит в логику, которая приводит к приведенному выше утверждению.Это электронное письмо никогда не устанавливается, но эта строка кода, которая происходит потом, выдает исключение, и я получаю электронное письмо из блока try / catch, который его перехватывает.

Я знаю, что, вероятно, мне следует просто отказаться от ViewBag,и у меня есть некоторые идеи по рефакторингу кода, чтобы он здесь не нужен, но ничего из этого не говорит мне, откуда это исключение.

Есть идеи?Тесты попробовать?


Редактировать: Вот остальная часть кода.Это определенно не тот код, которым я горжусь, но он должен работать ...

    public ActionResult PaypalConfirmation(string token, string payerID)
    {
        try
        {

            Cart cart = GetCurrentCart();
            if (cart == null)
            {
                                    // I never get this email.
                SendEmail("Paypal confirmation with null cart", "Token: " + token + ".<br><br>", requestData: Request);
                if (token != null && token != "")
                {
                    var tempCart = Cart.GetByAlternateOrderNumber(token);
                    if (tempCart != null)
                    {
                        cart = tempCart;
                    }
                    else
                    {
                        ViewBag.PaypalError = "we were unable to retreive your cart.";
                        return View("~/Views/Error/PayPal.cshtml");
                    }
                }
                else
                {
                    if (ViewBag == null)
                    {
                        SendEmail("VIEWBAG WAS NULL", "Token: " + token + ".<br><br>", requestData: Request);
                        return View("~/Views/Error/PayPal.cshtml");
                    }
                    else
                    {
                        // Line which errors
                        ViewBag.PaypalError = "we were unable to retreive your cart.";
                        return View("~/Views/Error/PayPal.cshtml");
                    }
                }
            }

            // More execution code here, including the "Everything worked" return.
        }
        catch (Exception ex)
        {
            try
            {
                var isNull = "";
                if (ViewBag == null) isNull = "ViewBag was null!<br><br>";
                SendEmail("Crash in Paypal Payment", isNull + ex.ToString(), requestData: Request);
                return View("~/Views/Error/PayPal.cshtml");
            }
            catch (Exception ex2)
            {
                SendEmail("Crash in reporting Paypal Crash!", ex.ToString() + "<br><br>---------------------<br><br>" + ex2.ToString());
                return View("~/Views/Error/PayPal.cshtml");
            }
        }
    }

Электронная почта из блока catch:

System.NullReferenceException: Objectссылка не установлена ​​на экземпляр объекта.в Website.Controllers.CartController.PaypalConfirmation (String token, String payerID) в C: ############# \ Website \ Controllers \ CartController.cs: строка 137

Отметка времени:06.03.2012 10:43:13
IP: #############
Запрошенный URL: / Cart / PaypalConfirmation? Token = EC-10L01937X56050826 & PayerID = ############

Пользовательский агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10.6; rv: 10.0.2) Gecko / 20100101 Firefox / 10.0.2

1 Ответ

1 голос
/ 08 марта 2012

Я сомневаюсь, что это происходит из-за нулевого ViewBag.Когда вы добавляете или удаляете строки, он меняет номера строк всего, что находится под ним.Так что это мог быть любой код ниже того, что вы изменили.Если новый код требует добавления нового класса using в класс, он мог бы изменить каждый номер строки в выходном байт-коде.

Вы пытались использовать электронную почту как форму регистрации, а не просто перехват исключений?Например, что происходит, когда вы пытаетесь это сделать?Не уверены, поможет ли свойство ex.Source?

public ActionResult PaypalConfirmation(string token, string payerID)
{
    var message = "Trying to confirm paypal.";
    SendEmail(message, message);

    try
    {
        message = "Getting current cart.";
        SendEmail(message, message);

        Cart cart = GetCurrentCart();

        message = cart == null
            ? "Current cart is null."
            : "Current cart is not null.";
        SendEmail(message, message);

        if (cart == null)
        {
            if (token != null && token != "")
            {
                message = "Getting temp cart by alternate order number.";
                SendEmail(message, message);

                var tempCart = Cart.GetByAlternateOrderNumber(token);

                message = "Getting temp cart by alternate order number.";
                SendEmail(message, message);

                if (tempCart != null)
                {
                    message = "Temp cart is not null";
                    SendEmail(message, message);

                    cart = tempCart;
                }
                else
                {
                    message = "Temp cart was null.";
                    SendEmail(message, message);

                    ViewBag.PaypalError = "we were unable to retreive your cart.";

                    message = "ViewBag.PayPalError set, returning view.";
                    SendEmail(message, message);

                    return View("~/Views/Error/PayPal.cshtml");
                }
            }
            else
            {
                message = "Setting ViewBag.PayPalError message.";
                SendEmail(message, message);

                // Line which errors
                ViewBag.PaypalError = "we were unable to retreive your cart.";

                message = "ViewBag.PayPalError set, returning view.";
                SendEmail(message, message);

                return View("~/Views/Error/PayPal.cshtml");
            }
        }

        // More execution code here, including the "Everything worked" return.
        message = "Executing more code.";
        SendEmail(message, message);
    }
    catch (Exception ex)
    {
        SendEmail(ex.GetType().Name + " caught", ex.Source);
        return View("~/Views/Error/PayPal.cshtml");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...