2010-03-26 20 views
5

tengo 2 acciones en un controlador:resultados RedirectToAction en modelo nulo

public class CalculatorsController : Controller 
{ 
    // 
    // GET: /Calculators/ 

    public ActionResult Index() 
    { 
     return RedirectToAction("Accounting"); 
    } 


    public ActionResult Accounting() 
    { 
     var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants(); 
     Debug.Assert(combatants != null); 
     var bvm = new BalanceViewModel(combatants); 
     Debug.Assert(bvm!=null); 
     Debug.Assert(bvm.Combatants != null); 
     return View(bvm); 
    } 

} 

Cuando se llama al método del índice, aparece un modelo nulo que sale. Cuando se llama directamente al método de Contabilidad a través de su url, obtengo un modelo hidratado.

+0

¿Qué versión de MVC está usando? –

+0

MVC2 RTM Creo, ¿cómo puedo verificar que la aplicación esté utilizando el MVC2 CTP/Beta/RTC/RTC2 correcto, etc.? – Maslow

+0

Sigue esta publicación en el blog y debería indicarte cómo diagnosticar qué versión está usando tu aplicación: http://bradwilson.typepad.com/blog/2010/03/diagnosing-aspnet-mvc-problems.html – amurra

Respuesta

1

Esto es menos una respuesta que una solución. No estoy seguro de por qué está obteniendo un modelo nulo, ya que parece que debería funcionar. De hecho, puedo confirmar el comportamiento que estás viendo cuando lo pruebo yo mismo. [EDIT: descubrí un error en mi código de prueba inicial que causaba mi propio modelo nulo. Ahora que eso está corregido, mi prueba funciona bien usando RedirectToAction.] Si hay una razón para ello, no lo sé de manera muy especial.

Ahora, para la solución alternativa ... Supongo que lo hace de esta manera, ya que la ruta predeterminada envía todo el tráfico a http://www.domain.com/Calculators a "Índice". ¿Por qué no crear una nueva ruta así:

routes.MapRoute(
    "Accounting", 
    "Calculators/{action}/", 
    new { controller = "Calculators", action = "Accounting" } 
); 

Esta ruta especifica la acción predeterminada al controlador calculadoras será "Contabilidad" en lugar de Índice.

+0

Bueno, la idea es que esta es una solución temporal hasta que tenga más calculadoras en lugar de solo una. agregar una ruta es menos sostenible para mí que hacerlo en el controlador y luego cambiar el controlador de índice cuando tengo algo mejor que hacer. – Maslow

+0

Puedo entender eso. Además, he podido hacer que esto funcione en uno de mis propios proyectos sin ninguna configuración especial, así que esto debería funcionar para usted también. ¿La vista de Contabilidad está fuertemente tipada (es decir, tiene algo así como Inherits = "System.Web.Mvc.ViewPage " en la parte superior)? –

1

Su visión para la Contabilidad de acciones espera un modelo. (el BalanceViewModel). El método de acción de índice no tiene una instancia de BalanceViewModel.

Hay varias formas de solucionarlo. En su Vista (página aspx) puede verificar nulos ...

O en el método de acción de índice, crea una nueva instancia de un BalanceViewModel y lo almacena en TempData, y luego recupera esto en su vista cuando su modelo es nulo.

O en su método de acción, también puede llamar a return View ("Contabilidad", nuevo BalanceViewModel()) en lugar de usar el redireccionamiento a la acción.

EDIT: Ejemplo de código - Si desea compartir este functinality, crear un método privado como esto:

public class CalculatorsController : Controller { 
    // GET: /Calculators/ 
    public ActionResult Index() { 
     return View(GetBalanceViewModel()); 
    } 

    public ActionResult Accounting() { 
     return View(GetBalanceViewModel()); 
    } 

    private BalanceViewModel GetBalanceViewModel() { 
     var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants(); 
     Debug.Assert(combatants != null); 
     var bvm = new BalanceViewModel(combatants); 
     Debug.Assert(bvm != null); 
     Debug.Assert(bvm.Combatants != null); 
     return bvm; 
    } 
} 

Ha visto esto Question?

+0

¿por qué debo proporcionar el modelo en la acción de índice si todo lo que quiero es que la acción de índice se transfiera a otra acción? – Maslow

+0

si ese es el caso, ¿ha intentado simplemente devolver el resultado de la contabilidad? algo así como: return Accounting(); en el método de acción de índice. (Solo una conjetura, todavía no lo he probado) –