2011-07-02 21 views
17

lo hago muy a menudo:Html.Action - Obtener frente Mensaje

<div id='Product'> 
@Html.Action("Create", "Product") 
</div> 

es conveniente porque se puede delegar la pintura de un formulario de creación de producto a otra acción del controlador para incrustar en algunos lugares. Sin embargo, tengo problemas con el hecho de que el método a veces (no he descubierto bajo qué condiciones) llama al [HttpPost] de mi acción de controlador, que por supuesto falla.

¿Hay alguna manera de forzar @ Html.Action() a llamar a la versión GET?

Respuesta

18

La forma en que Html.Action funciona es que si la solicitud actual de la página es un método de publicación, buscará el método con el nombre HttpPost.

Entonces, lo que está sucediendo es que está PUBLICANDO la página actual y la acción asume que todas las acciones que se deben ejecutar también deben ser POST.

No hay forma de que sepa forzarlo a cambiar a un método diferente como ese.

+5

sí, lo hice darse cuenta de eso. esa es una suposición terrible de su parte. Lo que terminé haciendo fue cambiar el nombre de las acciones para que no haya ambigüedad. – ekkis

+0

Probablemente sea la mejor solución. Me alegra ser de ayuda. – Buildstarted

3

Trate de añadir el atributo AcceptVerbs a su acción:

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] 
public ActionResult Create() 
{ 
    //Your code 
} 

Esto funciona tanto para peticiones GET y POST.

+0

hmm ... sí, pero eso me obligaría a codificar ambos comportamientos en el mismo método ... lo que significa que necesitaría una forma de decir dentro del método si se realizó una publicación o un envío ... ¿cómo se haría? – ekkis

-1

Acabo de encontrar este problema, que era difícil de identificar. Terminé usando Html.RenderPartial lugar, como este:

<div id='Product'> 
@{Html.RenderPartial("_CreatePartial", new Product());} 
</div> 
0

también me metí en un problema similar y ahí sí es una solución. Del cheque si la petición es GET o POST en Vista usando isPost propiedad y listo ....

@if(!IsPost)  
{  
    HTML.Action("ActionName")  
} 

Saludos a todo el que se puso en problema similar ...

Cuestiones relacionadas