RenderAction chama o método de ação errado
-
26-09-2019 - |
Pergunta
Estou lutando com a renderização, o problema é que ele chama o método de ação errado no meu controlador.
No meu controlador "usuários", existem dois métodos de ação chamados Edit, um para GET e outro para solicitações de postagem:
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...
}
Na minha opinião, estou chamando a renderização da seguinte forma:
Html.RenderAction("Edit", "Users", new { id = 666});
Agora, o problema é que eu quero que o método GET Action seja renderizado. No entanto (talvez porque o modelo também contenha uma propriedade chamada ID?), RenderAction chama meu método de ação postal.
Qual é a maneira correta de fazer isso? Estou usando o ASP.NET MVC 3 RC, caso isso importa.
Obrigado,
Adrian
Solução
Sub Action usa o método HTTP de sua ação pai
O problema é que sua visão está sendo renderizada após uma ação de postback. Todas as renderizações de sub-ação na visualização usam o mesmo método HTTP. Então, a postagem está sendo replicada neles. Não tenho certeza sobre o MVC3, mas no MVC2 não havia uma maneira interna de superar esse problema.
Portanto, o problema é que você deseja o seu Edit()
Ação a ser renderizada como uma visualização de postagem. Sai da caixa. Sem chance.
É claro que você pode fazer isso fornecendo sua própria funcionalidade = classes.
Outras dicas
Isso nem sequer compilar:
public virtual ActionResult Edit(UserViewModel model) {}
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Edit(UserViewModel model) {}
Você não pode ter dois métodos com o mesmo nome e mesmos argumentos na mesma classe. Também por que suas ações são virtual
?
ATUALIZAR:
Incapaz de reproduzir. Este não parece ser o 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);
}
}
E em Index.cshtml
Renderize a ação de edição chama a ação de edição correta (a que com parâmetro de identificação):
@{Html.RenderAction("edit", "home", new { id = "123" });}
Não tenho 100% de certeza se isso está disponível no MVC3, mas no MVC2 (com MVCFutures: Microsoft.Web.MVC) eu usaria:
Html.RenderAction<UsersController>(c => c.Edit(666));
Eu sei que isso é extremamente velho e estamos no MVC5 agora - mas esse ainda é o comportamento exibido ao executar Html.RenderAction()
.
Minha solução para este caso em particular foi fazer um cheque no meu [HttpPost]
ação para valores no meu modelo de visualização, e se eles fossem nulos (ou qualquer outra coisa), eu chamei meu return Edit()
, e se eles não fossem liguei AntiForgery.Validate()
para validar adequadamente o token.