Изящно возвращаясь к файлу .aspx.cs из улова другого класса - PullRequest
1 голос
/ 13 декабря 2011

У меня есть веб-проект, который имеет страницу с именем editemployee.aspx.Код позади является editemployee.aspx.cs.Из этого кода я называю другой проект библиотекой классов.Метод, который я вызываю в этой библиотеке классов, выглядит следующим образом ...

        public static Employee GetItem(int employeeid)
        {
            try
            {
                Employee chosenemployee = EmployeeDB.GetItem(employeeid);
                chosenemployee.EmployeeInsuranceRecord = EmployeeInsuranceRecordManager.GetItem(employeeid);
                return chosenemployee;
            }
            catch (Exception ex)
            {
                if (ex is NullReferenceException)
                {
                    //How can I return gracefully from here
                    //without disrupting the user experience?
                }
                else
                {
                    throw ex;  //if it makes it this far, it must be some other unknown error and I need an exception to be thrown for real so I can track down the bug.
                }
            }
        }

По сути, этот код получает полную запись сотрудника из уровня доступа к данным на основе переданного EmployeeID.Если исключением является NullReferenceException, это означает, что каким-то образом поддельный EmployeeID прошел.В этом случае я хочу вернуться на вызывающую страницу .aspx.cs, ОСТАНОВИТЬ процесс сортировки Employee прямо здесь и отобразить окно предупреждения JavaScript, которое говорит: «Указанный EmployeeID недействителен».

Поэтому я попытался сказать:

            if (ex is NullReferenceException)
            {
                Response.Write("<script>alert('"The EmployeeID supplied is not valid."')</script>"); 
            }

Но это не работает из отдельной библиотеки классов, как эта, он не распознает Response.Write.

В основном япросто нужно из этого метода дать сигнал вызывающей странице, чтобы она просто изящно остановилась и отобразила ошибку, вместо того, чтобы дать пользователю огромное уродливое неисправимое сообщение об ошибке.Любые советы?

Ответы [ 6 ]

1 голос
/ 13 декабря 2011

Я не думаю, что будет хорошей идеей использовать Response.Write из вашего кода, потому что он будет отображаться в начале страницы (даже перед тегом HTML). Однако есть несколько вариантов:

  1. Вы либо можете перехватить исключение NullReferenceException на странице Code-behind. Там у вас есть доступ к странице и вы можете вызвать ClientScript.RegisterScript или аналогичный.

  2. Из кода в вашей библиотеке вы можете получить доступ к объекту Response с помощью HttpContext.Current.Response.

Вы должны поймать исключение, как это

catch (NullreferenceException ex)
{
   // handle exception, e.g.
   HttpContext.Current.Response.Write("...");
}  

Все остальные исключения будут необработанными при прохождении вверх по стеку.

EDIT: Вместо того, чтобы писать прямо в ответ (что не очень хорошая идея), у вас есть следующие опции:

  1. Перенаправить на другую страницу (объясняя ошибку) с помощью HttpContext.Current.Response.Redirect ("Error.aspx");
  2. Зарегистрировать JavaScript

    catch (NullreferenceException ex)
    {
        string javaScript = "alert('The EmployeeID supplied is not valid');";
        HttpContext.Current.Page.ClientScript.RegisterStartupScript(typeof(thePage), "myScript", javaScript, true);
    }
    
1 голос
/ 13 декабря 2011

Неправильный метод отображения, он должен быть вместо:*

1 голос
/ 13 декабря 2011

Почему бы вам не поймать свой NullReferenceException с вашего editemployee.aspx.cs ? Что-то вроде:

try
{
    var employee = Employee.GetItem(int employeeid)
}
catch(NullReferenceException ex)
{
    Response.Write("<script>alert('"The EmployeeID supplied is not valid."')</script>"); 
}

Кроме того, вы должны не использовать оператор is для фильтрации типов исключений, но добавить правильный тип в операторе catch.

Блок catch может указывать тип исключения для перехвата. Этот тип называется фильтром исключений и должен быть либо типом исключения, либо производным от этого типа. Определенные приложением исключения должны происходить от ApplicationException.

( источник )

Наконец, рекомендуется бросать больше заданных Exception. В вашем случае пользовательский EmployeeNotFoundException будет лучше выбросить с вашего бизнес-уровня.

catch(NullReferenceException ex)
{
     throw new EmployeeNotFoundException(ex);
}
1 голос
/ 13 декабря 2011
  1. Прежде всего, ваш метод для получения Employee (EmployeeDB.GetItem (employeeid); ) должен возвращать ноль вместо выдачи исключения. И вы должны иметь нулевую проверку, прежде чем что-то делать с объектом.

  2. Во-вторых, мы никогда не должны бросать ex, если вы не добавляете дополнительную информацию. Скорее просто скажите «throw», потому что это не съест ваш след стека. Кроме того, если вы ничего не делаете в своем блоке исключений, просто дайте исключению всплыть и обработать его.

В вашем случае вам не нужно обрабатывать исключение, если вы проверяете на ноль.

1 голос
/ 13 декабря 2011

Существует множество способов сделать это, но, возможно, просто вернуть пустой объект Employee (или заполнить его кодом маркера), а затем в конце возврата проверить код маркера, а затем выполнить JS для предупрежденияпользователь.

Что-то вроде:

catch (Exception ex)
            {
                if (ex is NullReferenceException)
                {
                    return new Employee { Name = string.Empty }; // no idea what the Emp object looks like...
                    // or
                    return new Employee { Name = "666" };
                }
                    else
                    {
                        throw ex;  //if it makes it this far, it must be some other unknown error and I need an exception to be thrown for real so I can track down the bug.
                    }
                }

Не отлично, но выполнимо.

1 голос
/ 13 декабря 2011

Если вы хотите использовать код, который вы пробовали, вы можете написать HttpContext.Current.Response.Write("Whatever")

Лучшим решением будет отображение пользовательской страницы ошибок. Вот статья, которая описывает, как это сделать: http://www.asp.net/web-forms/tutorials/deployment/displaying-a-custom-error-page-cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...