2010-03-03 7 views
2

D'abord, j'utilise Asp.Net MVC 2 RC 2.Asp.Net Mvc 2 - Liste RenderAction avec créer

Ce que je veux faire est de lister une vue de commentaires et en dessous de ce point de vue pouvoir ajouter un commentaire (avec validations). Par exemple, quelque chose comme lorsque vous ajoutez un commentaire dans stackoverflow. Sauf que ma page devrait fonctionner avec ou sans Javascript activé. Donc, pour résoudre ce problème, j'utilise le nouveau RenderAction et il a partiellement résolu mon problème. J'ai ma liste qui appelle mon addercment usercontrol avec RenderAction.

Les validations fonctionnent. Mon problème se produit lorsque j'essaie d'ajouter un commentaire que c'est valide. La page ne s'est pas actualisée correctement. Si je suis dans la base de données, mon commentaire est ajouté, mais il n'a pas été actualisé dans ma vue de liste et le formulaire d'ajout de commentaire n'est pas clair.

Je pense que c'est à cause de la façon dont le flux de travail est rendu.

Peut-être que si quelqu'un a un exemple ou d'un blog à ce sujet, il est peut me aider à obtenir ce droit ...

Au fond de mon commentaire/List.aspx

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

Dans Commentaire/Create.ascx

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

Répondre

2

Vous pouvez forcer la vue parent de se rafraîchir avec une petite bidouille impliquant ViewContext.ParentActionViewContext.

Dans votre classe CommentController:

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

Et dans votre commentaire/Page List.aspx (vue):

<% 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); 
    } 
%> 

Donc, en gros, ce qui se passe est que l'action de l'enfant est "dire" l'action parent pour se rafraîchir en utilisant ViewData du parent.

C'est un peu un hack, mais ça marche bien pour ce que vous faites.