2012-02-16 5 views
0

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

У меня есть вызов Ajax для метода действия HttpPost. Если метод выполняется без исключения, я хочу, чтобы он загружал свои данные в виде частичного представления в элементе 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, у меня есть АЯКС вызов метода и [HttpPost] действий. Метод удаляет базу данных и возвращает данные на частичный вид. Если база данных или таблица, представляющая интерес, не работает, я хотел бы вернуть представление Error. Но я не могу показаться, чтобы объединить [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, и в настоящее время я просто выставляю предупреждение(). Есть ли что-то, что я могу сделать для метода выше, чтобы вызвать отображение ошибки? Или я должен использовать ошибку, возвращаемую в вызове Ajax, чтобы каким-то образом отобразить представление Error?

Вот мой Аякса вызов:

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

    error: function() { 

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

ответ

1

Проблема заключается в коде. Поскольку вы генерируете исключение, он автоматически останавливает процесс и возвращает 500 серверов ошибок (вы можете проверить вкладку «Сеть» в своем Firebug, чтобы увидеть это). Таким образом, мое предложение не бросить исключение здесь:

throw new ArgumentException(); 

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

Если вам нужно перенаправить на какой-то странице просто попытаться вернуть имя страницы, что вы хотите перенаправлять и сделать это в JS код, как описано здесь: How to reload page when an ajax request returns FormsAuthentication.RedirectToLoginPage?

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

error: function() { 

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

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

+0

Спасибо, решена часть проблемы, но не все. Метод действия выполняется успешно, но возвратите Error View в виде частичного представления ... Я хочу отобразить его как целую страницу. Мне не хватает чего-то еще ... – rgwozdz

+0

Укажите, как вы хотите отобразить эту страницу ошибок - как часть вашего запроса Ajax или хотите просто перенаправить на другую страницу. – Kath

+0

См. Обновления в ответе. – Kath

0

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

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

0

Вы все равно можете вернуть код состояния 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-адрес страницы ошибки.

+0

Спасибо за ваше решение, это тоже очень полезно. – rgwozdz

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