2015-12-03 4 views
4

У меня есть один контроллер Действие, которое имеет совсем другой вид, чем остальная часть моего приложения, и я хочу, чтобы все исключения, созданные этим действием, отображали другую страницу ошибок, чем остальная часть моего приложения ,ASP.Net MVC4 HandleError, не отображаемый вид рендеринга

Я изменил атрибут HandleError, но он НЕ загружает страницу с ошибкой вообще, когда возникает исключение.

[HttpPost] 
    [HandleError(View = "UPI_Error")] 
    public ActionResult ParticipantUpdate1(Participant part) 
    { 
     try 
     { 
      mps.ParticipantUpdate(LogonTicket, ParticipantID, part); 
     } 
     catch(Exception ex) 
     { 
      string x = ex.Message; 
     } 
     return View(); 
    } 

Любые идеи?

UPDATE

OK, изменения к этому:

[HttpPost] 
[HandleError(View = "UPI_Error", ExceptionType = typeof(ArgumentException))] 
public ActionResult ParticipantUpdateSuccess(Participant part) 
{ 
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging" 
    Participant OrigPart = CopyParticipant(part); 
    try 
    { 
     string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart); 
     if (result != "Update Success") 
     { 
      throw new ArgumentException(result); 
     } 
    } 
    catch (Exception e) 
    { 
     throw new ArgumentException(e.Message); 
    } 
    return View(); 
} 

Но, это все еще не загружает страницу UPI_Error. Вызов ParticipantUpdate бросает это исключение:

System.ServiceModel.FaultException`1 was unhandled by user code 
    HResult=-2146233087 
    Message=ORA-12899: value too large for column "CLI"."CLI_MAIN_ZIP" (actual: 21, maximum: 11) 

В статье по этой ссылке: http://www.c-sharpcorner.com/UploadFile/ff2f08/exception-or-error-handling-in-Asp-Net-mvc-using-handleerror/

Он говорит, что HandleError не в состоянии поймать исключение поднятого за пределами контроллеров. Поскольку исключение происходит в моей веб-службе и распространяется на мое приложение, может ли это быть частью проблемы?

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

UPDATE

ОК, я решил пойти другим путем. Я улавливаю исключение, копирую объект исключения в TempData, а затем вызываю свое пользовательское представление. Однако по какой-то причине я не могу изменить макет в представлении. Это происходит с исключением из NULL-ссылки. Есть еще идеи?

[HttpPost] 
[HandleError(View = "UPI_Error")] 
public ActionResult ParticipantUpdateSuccess(Participant part) 
{ 
    bool error = false; 
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging" 
    Participant OrigPart = CopyParticipant(part); 
    try 
    { 
     string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart); 
     if (result != "Update Success") 
     { 
      throw new ArgumentException(result); 
     } 
    } 
    catch (Exception ex) 
    { 
     error = true; // throw new ArgumentException(e.Message); 
     TempData["exception"] = ex; 
    } 
    if (!error) 
    { 
     return View(); 
    } 
    else 
    { 
     return RedirectToAction("UPIError"); 
    } 
} 

public ActionResult UPIError() 
{ 
    ViewBag.Exception = TempData["exception"]; 
    return View(); 
} 

Исключение брошено:

Сообщение ссылка = объект не указывает на экземпляр объекта. StackTrace: в ASP._Page_Views_Home_UPIError_cshtml.Execute() в ... \ Views \ Home \ UPIError.cshtml: линия 4

Вот строка 4, на мой взгляд (да, вид существует в общей папке):

Layout = "~/Views/Shared/_UPILayout.cshtml"; 

Если у вас возникли проблемы с именованием, но это получилось. Теперь я все еще получаю исключение Null Reference, но вид там и правильно указан.

ответ

-1

В обработчике ошибок, необходимо указать, что вы хотите использовать настраиваемое представление об ошибке для исключения типа ArgumentException, тогда поднятом в настоящее время за исключение есть System.ServiceModel.FaultException. Вы пытались поймать более высокий класс Exception, как:

[HandleError(View = "UPI_Error", ExceptionType = typeof(Exception))] 

Или более конкретно, чтобы проверить ваш случай:

[HandleError(View = "UPI_Error", ExceptionType = typeof(System.ServiceModel.FaultException))] 
+0

Пробовал оба с таким же результатом – MB34

-1

Чтобы страницы пользовательских ошибок работали, необходимо правильно настроить web.config. В <system.web> этот параметр должен присутствовать:

<customErrors mode="On" defaultRedirect="Error"/> 

Произвольный вид должен присутствовать в папке Views контроллера или в общей папке.

Следующее действие (на HomeController) демонстрирует это.Если вы вызовете это действие с идентификатором, установленным в 0, он выкинет ArgumentException и, таким образом, отобразит пользовательский вид ContactError. Если вы вызываете его с идентификатором, установленным в 1, он отображает представление по умолчанию Error. Если вы вызываете его с идентификатором больше 1 будет отображать Контактный вид

[HandleError(View = "ContactError", ExceptionType = typeof(ArgumentException))] 
public ActionResult Contact(int id) 
{ 
    if (id == 0) 
    { 
     throw new ArgumentException(); 
    } 
    if (id == 1) 
    { 
     throw new NotImplementedException(); 
    } 

    ViewBag.Message = "Your contact page."; 
    return View(); 
} 
+0

У меня уже есть customErrors установлен на On. Требуется ли defaultRedirect для пользовательских страниц ошибок? – MB34

+0

Нет, это не так. Ваш текущий код не генерирует исключение, потому что он пойман блоком 'catch'. – venerik

+0

Хорошо, я удалил 'try..catch', и он показывает YOSOD вместо моей пользовательской страницы ошибок. Я попробовал добавить defaultRedirect в мои пользовательскиеErrors как этот '' и получил этот URL 'Error.cshtml? Aspxerrorpath =/Home/MemberantUpdateSuccess' – MB34

-1

Это должно работать хорошо до тех пор, пока вы делаете НИЖЕ вещи

customErrors включен в файле web.config

<system.web> 
    <customErrors mode="On" /> 
</system.web> 

и вы украсили вас с использованием фильтра действий HandleError и указали имя вида.

[HandleError(View="MyError")] 
public ActionResult ErrorTest() 
{  
    throw new ArgumentException("Just-Throw-An-Exception"); 
    return View(); 
} 

И у вас есть мнение MyError.cshtml бритвы присутствует внутри внутри ~/Views/{YourCurrentControllerName} или ~/Views/Shared/ каталог.

+0

Разве вы не читали все сообщение здесь? Очевидно, на 100% ясно, что я соблюдаю все эти условия. Но это все еще не работает. Похоже, вы просто пытаетесь заткнуть свой путь, чтобы надеяться собрать на щедрость, что, как я полагаю, не должны быть награждены за *** *** НЕПРЕРЫВНЫЕ *** ответы, которые я получил. – MB34

+0

Я пробовал это в новом проекте и отлично работал. Поэтому я предполагаю, что в вашем проекте есть что-то еще, что заставляет его не работать. – Shyju

-1

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

Если вы поймаете исключение в catch try catch, блокируйте свои подсчеты кода из области catch и не делайте ошибок.

Вам нужна ошибка, выброшенная и не улавливаемая try catch block ro get error pages.

+0

Разве вы не видели 'throw new ArgumentException (e.Message);' в catch? – MB34

+0

Этот ответ был до вашего обновления. Прекратите ставить -1 для каждого ответа, который не работает для вас. Мы пытаемся дать вам некоторые идеи. –

Смежные вопросы