2010-04-30 47 views

Respuesta

8

Se puede declarar una forma como esta en su punto de vista y puede especificar cualquier controlador o acción que desea.

Html.BeginForm("SaveAll", "Category", FormMethod.Post); 

Si está en un controlador, puede usarlo.

TempData["Model"] = Model; 
RedirectToAction("SaveAll", "Category"); 
+0

creo que lo que el PO está tratando de hacer es actualizar su categorías desde la Vista del producto, y quiere mantenerlo todo SECO. –

+1

No es esto ... Lo necesito si ya estoy dentro de una acción y para hacer una publicación para otra acción en otro controlador ... – AndreMiranda

+1

@AndreMiranda, OK, pero ¿no es el objetivo final salvar sus categorías? ¿Te importa cómo sucede eso mientras sucede, utilizando las mejores prácticas? ¿Qué está tratando de lograr? Si solo necesita llamar a otro método de control, eso se puede hacer con la suficiente facilidad, sin crear una solicitud POST para hacerlo. –

2

Desde POST es un verbo para una solicitud HTTP, esto sólo tiene sentido (tal como está escrita) si el método de .Save() inicia una conexión de bucle de retorno HTTP a la apropiada .SaveAll(), (como http://..../Category/SaveAll) ruta y pasa la colección forma como parte de la solicitud. Esto es una tontería y no se recomienda, ya que esto afectará su capacidad de probar esta controladora.

Sin embargo, si quieres decir que desea llamar .SaveAll() y devolver su resultado prestado al cliente, se puede usar .RenderAction() y pasar la colección de modelo o forma recibida por .Save() como parámetro.

O, en el lado del servidor, simplemente crea una instancia del controlador de Categoría y llama a su método .SaveAll(), pasando nuevamente el modelo recibido por .Save() como parámetro.

public ActionResult Save(MyModel m) 
{ 
    Category cat = new Category(); 

    return cat.SaveAll(m); 
} 

Sin embargo, usted tiene que tomar el resultado de esa llamada y asegurarse de que está manejada adecuadamente por la vista resultante.

Si esto es lo que está tratando de hacer, vale la pena señalar que realmente debe tener el código del método .SaveAll() que realiza el guardado separado en una capa lógica de negocios dedicada en lugar de vivir en el controlador. Toda esta funcionalidad debería, en teoría, estar disponible para su uso en un controlador diferente, o en una biblioteca que podría incluirse en otras aplicaciones.

+0

De acuerdo, el BLL es el lugar para esto. –

+0

Si está probando sus controladores unitarios, entonces sus controladores están haciendo demasiado. –

5

Me gustaría actualizar directamente sus categorías en su repositorio desde su método de Guardar controlador de producto directamente, o refactorizar la funcionalidad Guardar categorías en su propio método, y llamarlo desde ambos métodos de controlador.

+0

Repositorio no es mi objetivo aquí ... lo siento – AndreMiranda

+0

+1 por decir "refactor", para lo cual tomé un párrafo completo. –

5
public class Product : Controller 
{ 
    ... 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save(FormCollection productValues) 
    { 
     ... 
     RedirectToAction("SaveAll", "Category", new { formValues = productValues }); 
    } 
    ... 
} 

public class Category : Controller 
{ 
    ... 
    public ActionResult SaveAll(FormCollection formValues) 
    { 
     ... 
    } 
} 

Se supone que está ejecutando el POST en el contexto del Producto.

0

retorno RedirectToAction ("ViewService", "administrador")

Aquí, "ViewService" es un nombre de acción y "admin" es el nombre del controlador

Cuestiones relacionadas