2012-03-23 8 views
6

En una aplicación MVC3, ¿se considera una mala práctica utilizar un bloque try catch dentro de un bloque de afeitar @{ } en la vista .cshtml?¿Está intentando atrapar en una mala práctica de la vista?

+0

¿Para qué? – SLaks

+0

@SLaks - Como dijiste, no hay una buena razón para esto y habría lógica en el lugar equivocado, no lo he hecho aún, pero solo quería avanzar y retroceder un poco. La razón es que me di cuenta de que tenía una excepción en la vista al asociar un objeto que tenía un valor externo válido en un punto, pero ese objeto extraño se había eliminado de la base de datos. Aquí hay un ejemplo de una asociación: 'phase.Container = containers.Where (cont => cont.ContainerId == phase.ContainerId) .SingleOrDefault();'. Tendré que manejar las excepciones aquí. ¿Debería todo linq estar rodeado de try catch? –

Respuesta

12

Mucho.

Las vistas no deben contener ninguna lógica real; cualquier cosa que pueda lanzar una excepción pertenece al controlador.

+19

Las afirmaciones generales como esta nunca son precisas. ¿Estás diciendo que es mala forma poner un código en una vista? Entonces, ¿por qué existe Razor? Y si tiene código en una vista, ciertamente puede haber casos donde las excepciones (como la falta de disponibilidad de un archivo externo) necesitan ser manejadas. – Gullbyrd

+1

¿Qué sucede si se trata de una vista parcial compartida y no hay controlador para ella? –

+0

@MaksimVi .: Entonces deberías usar una acción infantil en su lugar. – SLaks

1

Yo diría que sí. La ruta óptima sería hacer pasar el Modelo a la Vista validado por el controlador antes de que llegue a la vista.

2

Bueno, su uso depende de los detalles de su aplicación, sin embargo, debe tratar de mantener sus puntos de vista lo más simple posible. Idealmente, la validez del código se verificaría en el controlador y nunca se pasaría a la vista.

2

No coloque dicho código en Vistas. Las vistas deben ser solo para su marcado de visualización tanto como sea posible. Puede poner esa captura de prueba en su método de acción de controlador que suministra los datos a una vista.

public ActionResult GetUser(int id) 
{ 

    try 
    { 
    //Get the ViewModel and return the correct View. 
    } 
    catch(Exception ex) 
    { 
    //log the error 
    return View("YourErrorView"); 
    } 

} 

Tenga en cuenta que una de las cosas que MVC enfatiza es la separación de las preocupaciones. Las vistas deben ser limpias y legibles.

0

No es algo bueno que hacer. El marco MVC está diseñado para separar la vista con la lógica. Así que mantén la lógica donde debería estar, en el controlador.

1
@{ 
try 
{ 
    <td> 
     @((TradeType)Enum.Parse(typeof(TradeType), item.AppCode)).GetDescription(); 
    </td> 
} 
catch 
{ 
    <td>@item.AppCode 
    </td> 
} 
} 
+3

Realmente no es una respuesta a la pregunta: la pregunta era si era una buena práctica, no cómo se hace. – Stephen

+0

Si bien esto puede responder la pregunta, no dejaste ninguna explicación sobre por qué esto funciona. Esta respuesta no agrega mucho valor para los visitantes posteriores que puedan tener el mismo problema. Por favor expanda su respuesta para incluir alguna explicación. –

Cuestiones relacionadas