Pregunta

Estoy luchando con RenderAction, el problema es que se llama al método acción equivocada en mi controlador.

En mi regulador "Usuarios" hay dos métodos de acción llamados edición, uno para get y uno para las solicitudes POST:

public virtual ActionResult Edit(int id)
{
 //return a view for editing the user
}


[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model)
{
 //modify the user...
}

En mi opinión, voy a llamar a RenderAction como sigue:

Html.RenderAction("Edit", "Users", new { id = 666});

Ahora el problema es que quiero el método de acción llegaría a ser prestados. Sin embargo (tal vez debido a que el modelo también contiene una propiedad llamada ID?), RenderAction llama mi método de acción POST en su lugar.

¿Cuál es la forma correcta de hacer esto? Estoy usando ASP.NET MVC 3 RC en caso de que importa.

Gracias,

Adrian

¿Fue útil?

Solución

usos de acción Sub método HTTP de su acción padres

El problema es que su punto de vista es que se queden después de una acción de devolución de datos. Todas las representaciones sub-acción en la vista utilizan el mismo método HTTP. Así POST está siendo replicado en ellos. No estoy seguro acerca de MVC3, pero en MVC2 Ya no había incorporado en forma de superar este problema.

Así que el problema es que usted quiere que su acción Edit() que se representa como un GET en una visión POST. Fuera de la caja. De ninguna manera.

Se puede hacer, por supuesto, al proporcionar su propia funcionalidad = clases.

Otros consejos

Esto ni siquiera compilará:

public virtual ActionResult Edit(UserViewModel model) {}

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model) {}

No se puede tener dos métodos con el mismo nombre y los mismos argumentos en la misma clase. También por eso que sus acciones son virtual?


ACTUALIZACIÓN:

No se puede repro. Esto no parece ser el caso:

public class UserViewModel
{
    public int Id { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Edit(int id)
    {
        return View(new UserViewModel());
    }

    [HttpPost]
    public ActionResult Edit(UserViewModel model)
    {
        return View(model);
    }
}

Y en Index.cshtml hacen que la acción de edición llama a la acción Editar correcta (la que tiene parámetro id):

@{Html.RenderAction("edit", "home", new { id = "123" });}

No estoy 100% seguro de si esto está disponible en MVC3, pero en MVC2 (con MvcFutures: Microsoft.Web.MVC) Me gustaría usar:

Html.RenderAction<UsersController>(c => c.Edit(666));

Sé que esto es muy antigua, y estamos en MVC5 ahora -. Pero esto sigue siendo el comportamiento exhibido cuando se ejecuta Html.RenderAction()

Mi solución a este caso en particular, era hacer una marca en mi acción [HttpPost] para los valores en mi modelo de vista, y si eran nulas (o lo que sea) me llamó a mi return Edit(), y si no fueran lo llama a AntiForgery.Validate() validar correctamente el token.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top