2009-07-02 14 views
9

Nel controller, provare ... catch può catturare l'eccezione. Come individuare l'eccezione in vista? per esempio, la vista può avere codice come:come individuare l'eccezione della vista MVC?

<%= Html.Encode(Model.MyID)%> 

Se il modello è nullo, si otterrà un'eccezione quando l'accesso la vista. dove rilevare l'eccezione e reindirizzare l'utente a una pagina di errore con un messaggio di errore user-friendly?

+0

Quale tecnologia stai utilizzando? –

+0

MS ASP.NET MVC framework – KentZhou

+1

Non userei eccezioni per comportamento non eccezionale e sicuramente non nella vista. – Paco

risposta

1

Questa logica deve essere gestita all'interno del controller e non nella vista. Ad esempio se si sta tentando di visualizzare un prodotto con MyID che non esiste, quindi reindirizzare a una pagina di errore.

Se si è verificato un errore, è possibile reindirizzare a una vista InvalidProduct che fornisce una descrizione/istruzioni di errore più dettagliate.

Modifica: Oltre ai commenti delle persone di seguito per rilevare le eccezioni non gestite, aggiungere l'attributo [HandleError] sulla dichiarazione del metodo ActionResult o sul Controller (per tutti i ActionResults).

[HandleError] 
public ProductsController 
{ 
    public ActionResult Show(int id) 
    { 
     Product p = //e.g. get product from db 

     if (p == null) 
     { 
      return RedirectToAction("Error"); 
      //return RedirectToAction("InvalidProduct"); 
     } 

     return View(p); 
    } 
+1

Cosa succede se c'è un'eccezione/errore di cui non si conosce l'esistenza? –

+2

L'applicazione dovrebbe "fallire velocemente". Non puoi gestire un'eccezione che non conosci comunque. – jlembke

+1

Questa non è una risposta alla domanda dell'OP. Ovviamente è meglio avere questo tipo di logica nel controller, ma non è ancora una risposta. Sto lavorando a un prototipo sul posto presso un cliente dove occorrono circa 15 minuti per caricare i file. Le viste possono essere modificate in Blocco note, ma per modificare il controller, devo ricompilare sulla mia macchina e caricare i file binari. Quindi sto usando il Views per provare le cose. Ma non riesco a vedere le eccezioni, dato che sono nascoste da qualche proxy tra me e il server, e non appaiono nei log. Sto ancora cercando una soluzione. – cheeesus

1

Beh, non si può sempre cogliere ogni errore nel controller, ma spero che le vostre opinioni dovrebbe essere leggero abbastanza in cui è molto improbabile che accada.

Tuttavia, se viene generata un'eccezione nella vista, è necessario impostare una pagina di errore 500 personalizzata per reindirizzare l'utente nel caso. Credo che tu possa impostare un reindirizzamento come questo nel Global.asax o potrebbe anche essere un settaggio IIS.

4

Basta aggiungere l'attributo [HandleError] alla parte superiore della classe Controller. In questo modo, verrà gestita qualsiasi eccezione generata dal controller e verrà visualizzato /Views/Shared/Error.aspx. Il modello passato a quella vista è un oggetto System.Web.Mvc.HandleErrorInfo.

Il controllore:

[HandleError] 
public class MyController : Controller 
{ 
    public ActionResult Default() 
    { 
    MyClass thing = MyClassFactory.Create(); 
    return View(thing); 
    } 
} 

Questa è una per la gestione delle eccezioni "ultima risorsa". La risposta di David è la migliore per quei casi che puoi pensare in anticipo.

2

Anche se sostengo la risposta di David Liddle ("Questa logica dovrebbe essere gestita all'interno del vostro controller e non il Visualizza") Posso anche dirvi che si dovrebbe codificare difensiva in generale.

Per esempio, invece di

try 
{ 
    Html.Encode(Model.MyID) 
} 
catch 
{ 
    Response.Redirect("~/Error/500"); 
} 

si dovrebbe

if (Model == null) 
{ 
    // ... 
} 
else 
{ 
    //..... 
} 

(naturalmente, ancora una volta, non mettere la logica di selezione vista in una vista)

+1

devo aggiungere '@' prima di 'if' e' else'? –

0

È possibile utilizzare try/catch in un blocco di script nella vista:

@try 
{  
    <div>typical Razor view stuff here...</div> 
} 
catch (Exception ex) 
{ 
    @<script type="text/javascript"> 
    alert('@ex.Message.Replace("'","\\'").Replace("\r\n","<br/>")'); 
    </script> 
} 
0

Sono d'accordo con Matthew Groves che non puoi sempre cogliere ogni errore. Purtroppo nel mio caso, ho una visione che ha 100 variabili qualcosa. È difficile tener conto di tutti loro.

C'è una varietà di modi per catturare gli errori qui: http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

Nel mio caso, ho voluto registrare l'errore che si è verificato nella visualizzazione con i dati che è stato utilizzato nel controller. Quindi ho scelto di sovrascrivere OnException nel mio controller. In questo modo, durante l'azione, posso memorizzare i miei dati sull'istanza del controller e accedervi successivamente nel metodo OnException.

Problemi correlati