ASP MVC3 HandleError на HttpPost - PullRequest
       15

ASP MVC3 HandleError на HttpPost

0 голосов
/ 16 февраля 2012

Сообщение обновлено, чтобы отразить частичное исправление, предложенное @Kate.Оригинальный пост ниже нового поста:

У меня есть Ajax-вызов метода HttpPost Action.Если метод выполняется без исключения, я хочу, чтобы он загружал свои данные как частичное представление в элементе div (он делает это успешно).Если есть исключение, я хочу, чтобы загрузить asp mvc Error view как полное представление страницы.Однако в приведенном ниже коде исключение заставляет представление Error загружаться как частичное представление в указанном элементе div.Я, должно быть, что-то упускаю из своего контроллера ...

[HttpPost]
[HandleError]
public ActionResult LoadUnmappedProjects()
{
    bool error = false;
    try
    {
        throw new ArgumentException();
    }
    catch (Exception e)
    {
        error = true;
    }

    if (!error)
        using (var db = new prismEntities())
        {
            return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
        }
    else
    {
        return View("Error");
    }   
}

Идеи ???

ОРИГИНАЛЬНАЯ ПОЧТА

В сети ASP MVC3приложение, у меня есть вызов ajax и метод действия [HttpPost].Метод обращается к базе данных и возвращает данные в частичное представление.Если база данных или таблица интереса не работает, я хотел бы вернуться к представлению «Ошибка».Но я не могу объединить [HttpPost] и [HandleError] в методе, чтобы добиться этого:

    [HttpPost]
    [HandleError]
    public ActionResult LoadUnmappedProjects()
    {

        try
        {
            throw new ArgumentException();
        }
        catch (Exception e)
        {
            throw new CustomDbException(e);
        }

        using (var db = new prismEntities()){
        return PartialView(db.dmPSPProjectStatewideRegionals.ToList());
        }


    }

Файл Error.cshtml не обрабатывается.Вместо этого при вызове Ajax возвращается ошибка, и в настоящее время я просто выдаю предупреждение ().Есть ли что-то, что я могу сделать с вышеописанным методом, чтобы вызвать представление Error для рендеринга?Или я должен использовать ошибку, возвращенную в вызове Ajax, чтобы каким-то образом отобразить представление Error?

Вот мой вызов ajax:

$.ajax({
    url: pathLoadUnmappedProjects,
    type: 'POST',
    dataType: 'html',
    contentType: 'application/json; charset=utf-8',
    success: function (result) {
        $('#unmappedProjects').html(result);
    },

    error: function () {

        alert("Error:");
    }
});

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Вы все еще можете вернуть код состояния 500 и позволить вызову AJAX обработать ошибку.

Ваше действие:

 public ActionResult LoadUnmappedProjects() 
 { 
     bool error = false; 
     try 
     { 
         throw new ArgumentException(); 
     } 
     catch (Exception e) 
     { 
         error = true; 
     } 

     if (!error) 
         using (var db = new prismEntities()) 
         { 
             return PartialView(db.dmPSPProjectStatewideRegionals.ToList()); 
         } 
     else 
     { 
         Response.StatusCode = 500;
         return View("Error"); 
     }    
 } 

, а затем ваш вызов AJAX:

$.ajax({      
    url: pathLoadUnmappedProjects,      
    type: 'POST',      
    dataType: 'html',      
    contentType: 'application/json; charset=utf-8',      
    success: function (result) {      
        $('#unmappedProjects').html(result);      
    },      

    error: function (xhr, ajaxOptions, thrownError) {
         $('html').html(xhr.responseText);
    }     
}); 

Я сам обработал бы ошибку, отобразил бы некоторые сообщения и не показал бы полную страницу ошибки, но выбор остается за вами.Ответ Кейт также твердый, изменив URL-адрес на страницу ошибки.

1 голос
/ 17 февраля 2012

Проблема в вашем коде. Поскольку вы выкидываете исключение, оно автоматически останавливает процесс и возвращает 500 Error server (вы можете проверить вкладку Net в вашей Firebug, чтобы увидеть его). Итак, мое предложение не бросать исключения здесь:

throw new ArgumentException();

You can something like that:
try
{
     ...
}
catch (Exception e)
{
    error = true;
}
if (error)
{
// render Error page
}

Если вам нужно перенаправить на какую-то страницу, просто попробуйте вернуть имя страницы, на которую вы хотите перенаправить, и сделайте это в коде JS, как описано здесь: Как перезагрузить страницу, когда запрос ajax возвращает FormsAuthentication.RedirectToLoginPage?

Таким образом, ваш код будет выглядеть так:

error: function () {

        window.location.href = "Error/Index";
    }

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

0 голосов
/ 17 февраля 2012

Я не думаю, что вы можете добиться этого с помощью действия LoadUnmappedProjects, поскольку вы выполняете Ajax-вызовы.В вашем случае возвращаемая страница с ошибкой обрабатывается как обычная страница, поэтому выполняется часть 'success' вашего бита ajax.

Я бы лучше попытался вернуть некоторый флаг (код, пустая строка, что угодно),в случае исключения, проверьте это в разделе «успех» и перенаправьте на страницу ошибок (если вы действительно хотите это сделать) из jQuery.

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