2011-01-10 11 views
37

¿Puede darme algún consejo general sobre cómo depurar enlaces MVC de ASP.NET?Mejores prácticas para la depuración Envolvente MVC de ASP.NET

Cuando todo funciona como se espera, ASP.NET MVC es excelente. Pero si algo no funciona, como si algo no se viniera por alguna razón desconocida, me resulta difícil rastrear el problema y me encuentro pasando horas buscando un problema aparentemente simple.

Imaginemos que la tierra en un método controlador de la siguiente manera:

[HttpPost] 
public ActionResult ShipmentDetails(Order order) 
{ 
    //do stuff 
} 

Imaginemos, además, que la clase de pedido es el siguiente:

public class Order 
{ 
    public decimal Total {get; set;} 
    public Customer Customer {get; set;} 
} 

public class Customer 
{ 
    public string Name {get; set;} 
    public string Phone {get; set;} 
} 

¿Cuáles son buenos puntos de partida cuando Order en el el método del controlador no está vinculado correctamente? ¿Cuáles son buenos lugares para comenzar cuando solo partes del Order están vinculadas correctamente?

Respuesta

20

Como Darin ha sugerido, comience por inspeccionar lo que se envía desde el cliente al servidor usando Firebug, Fiddler u otra herramienta proxy de depuración web.

De lo contrario, es posible que desee recorrer el código fuente para ver qué ocurre durante el enlace.

Dos maneras en que puedo recomiendo hacer esto son

  1. Include the System.Web.Mvc source code project in your application and reference this. Esto es bueno para aprender, pero probablemente no se recomienda para una aplicación comercial.

  2. Descargar los símbolos para System.Web.Mvc desde los servidores de símbolos de Microsoft, cambiar la configuración para poder debug framework source code and set a break point appropriately to step through.

+0

'" establecer un punto de interrupción de forma apropiada "' ¿Dónde está esto para el encuadernador modelo? – StuperUser

+2

Desea establecer un punto de interrupción en la clase 'DefaultModelBinder' de la estructura MVC' 'objeto virtual público BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext)' método –

+1

Después de habilitar/descargar los símbolos, ¿cómo puede llegar a la fuente para ' DefaultModelBinder' para establecer el punto de interrupción? –

3

Un buen lugar para comenzar es descargar e instalar FireBug y ver qué se publica del cliente al servidor. Luego verá lo que falta, lo incorrecto ... Las publicaciones de blog como Model Binding to a List son buenas lecturas y se familiarizan con la sintaxis adecuada que utiliza la carpeta de modelo predeterminada.

+0

Pero no indica qué hace el enlace de mvc con los datos ... ¿hay alguna manera de rastrear el proceso de vinculación del modelo? – Dani

+0

@Dani, ¿qué desea saber sobre el enlace del modelo? Es bastante sencillo: un campo de entrada llamado 'Customer.Name' se vinculará a la propiedad' Name' de una propiedad compleja 'Customer' de un modelo. No hay nada especial al respecto. Y una vez que obtenga el concepto de listas y colecciones, sabrá todo lo que hay que saber sobre el funcionamiento del enlace de modelos. Cuando no FireBug le mostrará la solicitud, sabrá de inmediato por qué no se ha vinculado una propiedad: es porque falta la solicitud, tiene un nombre no válido o un formato no válido. –

+0

Creo que lo que me falta es la colección y las listas, y qué hacer con los nuevos elementos. las muestras que he usado hasta ahora agregan filas a la cuadrícula con identificación aleatoria, y no hay límites en mi código, he visto un ejemplo que intenta volver a numerar, pero el ejemplo original (steve Sandersen) funciona sin él ... .. – Dani

23

Aunque @russ's answer es útil y a veces será necesario, las dos opciones parece un poco bajo nivel cuando la cuestión principal es más sobre el cuadro grande. Por lo tanto, recomendaría Glimpse.

Desde su página acerca de:

y hellip; Glimpse le permite depurar su sitio web o servicio web directamente en el navegador. Glimpse te permite "echarle un vistazo" a lo que está sucediendo en tu servidor web. En otras palabras, lo que Firebug es para depurar el código del lado del cliente, Glimpse es depurar el servidor dentro del cliente.

Y como ha preguntado específicamente sobre el enlace de datos, querrá consultar el binding tab documentation.Podrás ver, de nuevo a partir de los documentos:

  1. ordinal: Orden en la que la infraestructura Encuadernación MVC Modelo trató de enlazar los datos disponibles
  2. Modelo Carpeta: Modelo de la carpeta que se utilizó en un escenario dado
  3. propiedad/Parámetro: Nombre de la cosa que el aglutinante estaba tratando de obligar
  4. Tipo: Tipo de la cosa que el aglutinante era tratando de obligar
  5. proveedores de valor intentos de: Proveedores de que el aglutinante intentado utilizar para obtener un valor dado (y si se ha realizado correctamente)
  6. Intento de Valor: El valor real que el proveedor tiene que trabajar con (tipo de conversación de correos, etc.)
  7. cultura: la cultura que se utiliza para analizar el valor bruto raw valor: el valor bruto de que el proveedor tiene que trabajar con (conversación de tipo pre, etc.)

Ver el quick start. En pocas palabras:

  1. instalar el paquete glimpse.mvc3
  2. Ir a http://yourhost/yourapp/Glimpse.axd y "encenderla".
  3. Haz clic en el ícono de aturdimiento en la parte inferior derecha de cualquier vista en tu aplicación para obtener más información.
+0

¡Respuesta muy útil, gracias! – nrodic

Cuestiones relacionadas