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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top