2011-01-06 9 views
5

Tengo una vista de formulario que usa un modelo de vista. La Acción "Nuevo" representa una nueva vista. Cuando se envía este formulario, devuelvo la información a la acción "Agregar".ASP.Net MVC return Ver con la nueva Instancia de modelo en lugar de usar redirigir a la acción

Si todas las acciones en DB son exitosas, quiero actualizar la vista. Creo una nueva instancia de viewmodel desde la acción "Agregar" y devuelvo View ("Nuevo", viewModel). Esto no refresca mi vista. Todos los valores antiguos (que se enviaron) permanecen en la vista. ¿Hay alguna manera de actualizar la página sin el método RedirectToAction?

He leído en otra publicación que ModelState.Clear no debe utilizarse, ya que puede tener un resultado no deseado.

Gracias,

Mar

Edición 1 - Código Agregado

New 

public ActionResult New(string id) 
     { 
      var sysId= new Guid(id); 
....... 
........ 

    string Details = pDto.Name + "(" + pDto.Code + ")"; 

      var vm= new ViewModel(id); 
      vm.Details = Details; 

      return View(vm); 
     } 



public ActionResult Add(ViewModel vm) 
     { 
         ViewModel vm= vm; 

      if (ModelState.IsValid) 
      { 

           var dto= _qRepository.GetFeaturesBy(viewModel.Code); 

       if (dto!= null) 
       { 

        ModelState.AddModelError("Code", "Code is already in Use."); 

        return View("New", viewModel); 
       } 

       _productService.AddFeature(..........); 
       // ModelState.Clear(); -- this works   
       vm= new ViewModel(vm.pId) { Message = "Code" + viewModel.Code + " was added ......", Details = vm.Details }; 

      } 


      return View ("New", vm); 

     } 
+0

¿puede publicar el código de lo que está haciendo actualmente? –

+0

He publicado el código - – TheMar

Respuesta

5

Debe intentar cumplir con el patrón post-redirect-get. La única vez que no lo hace es cuando la publicación falló y desea devolver los errores de validación para que el cliente pueda volver a publicar el formulario. Esto es lo que sucede cuando devuelve una vista desde un método de acción posterior. Todos los valores de formulario todavía flotan en ModelState esperando a usarse nuevamente en el formulario.

Puede usar RedirectToAction("New") si desea que el usuario agregue otro artículo de inmediato. Además, parece que ambas acciones deben llamarse New y luego decorar la versión de publicación con un atributo [HttpPost] y el parámetro PostModel. Las cosas se complican si publica y se interpone entre dos acciones diferentes, porque entonces tendría que recordar establecer explícitamente la acción en el formulario html y también devolver la vista correcta en caso de falla de validación.

+0

, ya que este es mi primer proyecto de MVC, me gustaría seguir las mejores maneras y post-redirect-get parece ser el correcto. Gracias – TheMar

0

Se está prestando con los valores de los atributos de llenado, o el navegador es "autofilling" la forma?

RedirectToAcction causará una respuesta 302 y luego un nuevo "Get" al nuevo formulario.

+0

Lleno el modelo de vista con algunos valores cuando se crea una primera instancia y no deseo volver a consultar los mismos valores. Esta es la razón por la que no quisiera ir a Acción nueva y rellenar el nuevo "modelo de vista" con parámetros (del modelo de vista publicado) – TheMar

4

Su modelo se está restaurando bien.

El problema es que los HTMLHelpers buscan datos en ViewState y ModelState primero antes de usar el nuevo modelo que pasó.

Casi no tiene otra opción, PERO para borrar ModelState o cambiar manualmente las entradas de ModelState usted mismo.

+0

¿consideraría utilizar el método claro como seguro? Hace lo que necesito. – TheMar

+0

Lo uso cuando sea apropiado. – jfar

Cuestiones relacionadas