2013-12-13 4 views
2

У меня есть мнение с контроллером загрузки Wich пожаров этот ActionResult:Throw исключение в методе ActionResult

[HttpPost] 
    public ActionResult ProcessSubmitUpload(HttpPostedFileBase attachments, Guid? idDocument) 
    { 
      //Validations 
      var xmlDocument = XDocument.Load(attachments.InputStream); 
      DocumentCommonHelper.SendFile(xmlDocument); 
    } 

Метод SendFile:

public static void SendCte(XDocument xmlDocument) 
    { 
     var client = new WsSoapClient(); 
     client.InsertXML(xmlDocument); 
    } 

вебсервис возвращает SoapException если somethig идет не так, как: «Документ IDDocument не существует» и т. Д.

Но в MVC при им отладке, если что-то пошло не так в методе InsertXml, я не могу его поймать , отладка навигации просто остановить и выбросить Ошибка загрузки файла.

Я хотел бы поймать сообщение возврата метода InsertXML в своем действии и вернуть его в мое представление. Как всплывающее окно «alert». Как я могу это сделать?

+1

использование 'попытаться поймать {} {}', чтобы поймать ошибку. Если вы хотите всплывающее окно, я бы рассмотрел использование диалогового окна [JQuery UI Dialog] (http://jqueryui.com/dialog/). Работа с асинхронным действием через jquery или javascript позволит вам поймать сообщение или HTML и сгенерировать ваше диалоговое окно. – James

+0

@James, какое исключение мне нужно обрабатывать? – gog

+0

вы должны обрабатывать любые исключения, которые, по вашему мнению, могут быть возвращены первыми, тогда всегда обрабатывайте 'exception' last, чтобы поймать любые другие. – James

ответ

3

Вы можете вернуть сообщение об ошибке в представление объекта ModelState. Представление может отобразить его с помощью помощника ValidationSummary:

[HttpPost] 
public ActionResult ProcessSubmitUpload(HttpPostedFileBase attachments, Guid? idDocument) 
{ 
     //Validations 
     var xmlDocument = XDocument.Load(attachments.InputStream); 
     try 
     { 
      DocumentCommonHelper.SendFile(xmlDocument); 
     } 
     catch(Exception ex) 
     { 
      ModelState.AddModelError("ProcessSubmitUpload", ex.Message); 
      return View(new MyViewModel()) 
     } 
} 

Вид:

@using(Html.BeginForm("ProcessSubmitUpload", "MyController", FormMethod.Post)) 
{ 
    @Html.ValidationSummary() 
    ... etc. 
} 
+0

Свойство ex.Message типа Exception вернет ответ InsertXML? Могу ли я использовать «throw new» в этом случае? – gog

+0

Он будет содержать описание исключения, созданного методом SendFile (или InsertXML). –

+1

Извините, не прочитал ваш второй вопрос. Если вы создадите новое исключение в обработчике, вы получите желтый экран смерти (или свою собственную страницу ошибок, если она настроена). Если вы хотите дать пользователю сообщение, вам необходимо обработать исключение (как в моем примере) и вернуть сообщение об ошибке пользователя в представление для отображения способом, совместимым с другими сообщениями об ошибках (например, проверка). ModelState - это обычный способ сделать это, поскольку именно это MVC использует для сообщений проверки. –

2

Вы можете обернуть свой метод вызова SendFile блоком try..catch, и он catch раздел заполнить результат возврата с соответствующей информацией о неисправности.

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