Pergunta

Primeiro, eu uso asp.net MVC 2 RC 2.

O que eu quero fazer é listar uma visualização de comentários e abaixo desta visualização pode ser capaz de adicionar comentários (com validações). Por exemplo, algo como quando você adiciona comentários no Stackoverflow. Exceto que minha página deve funcionar com ou sem JavaScript ativado.

Portanto, para resolver esse problema, uso a nova renderização e resolvi parcialmente meu problema. Recebi minha visão da lista que chama meu addComment UserControl com renderização.

As validações funcionam. Meu problema ocorre quando tento adicionar um comentário que é válido. A página não atualizou corretamente. Se eu entrar no banco de dados, meu comentário é adicionado, mas não foi atualizado na minha visualização da lista e o formulário de adição de comentários não está claro.

Eu acho que é por causa de como o fluxo de trabalho é renderizado.

Talvez se alguém tivesse um exemplo ou blog sobre isso, isso pode me ajudar a acertar ...

Na parte inferior do meu comentário/list.aspx

<% Html.RenderAction("Create", "Comment"); %>

Em comentário/create.ascx

<% using (Html.BeginForm(
       ViewContext.ParentActionViewContext.RouteData
           .Values["action"].ToString(),
       ViewContext.ParentActionViewContext.RouteData
           .Values["controller"].ToString(), 
       FormMethod.Post, new { id = "createForm" })){ %>
Foi útil?

Solução

Você pode forçar a visualização pai a se refrescar com um pequeno hack envolvendo ViewContext.parentactionViewContext.

Na sua classe de comentários:

public ActionResult Create(Comment comment)
{
    ...
    if (isValid) // Comment entered in form is valid
    {
        ControllerContext.ParentActionViewContext.ViewData["SuccessfullCreate"] = true;
    }
    ...
}

E em seu comentário/list.aspx página (exibir):

<% Html.RenderAction("Create", "Comment"); %>
<%
    if (ViewContext.ViewData["SuccessfulCreate"] != null)
    {
        string action = ViewContext.RouteData.Values["action"].ToString();
        string controller = ViewContext.RouteData.Values["controller"].ToString();
        string url = "/" + controller + "/" + action;

        Response.Redirect(url);
    }
%>

Então, basicamente, o que está acontecendo é que a ação infantil está "dizendo" à ação dos pais para se refrescar usando o ViewData dos pais.

É uma espécie de hack, mas funciona bem para o que você está fazendo.

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