2010-07-15 15 views
1

j'ai rencontré quelques problèmes en essayant d'obtenir des mises à jour partielles pour travailler dans ASP.NET MVC2. (Je pense) J'ai suivi de près les tutoriels que j'ai trouvés en ligne, mais la partie Ajax ne fonctionne pas. Le contrôleur fait ce qu'il est censé faire sans erreurs, mais la page ne se met pas à jour elle-même. Lorsque je rafraîchis la page, je peux voir le résultat de mon action.Ajax mise à jour partielle avec vue partielle ne fonctionne pas dans ASP.NET MVC2

Voici le code pour le contrôle de l'utilisateur qui est censé se mettre à jour:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Ideas.Models.Comment>" %> <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script> <script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> <script type="text/javascript"> 

    function AnimateVotebox() { 
     $("#commentbox").animate({ fontSize: "1.5em" }, 400); 
    } 

</script> <div id="commentbox"> 
    <div class="display-label"> 
     <i><%: Html.ActionLink(Model.User1.UserName, "Details", "User", new { id = Model.User1.LoweredUserName.Replace(' ', '-') }, null)%> zegt:</i> 
    </div> 
    <div class="display-label"><%:Model.text %></div> 
     <% bool canPost = Ideas.Helpers.UserHelper.CanPost(HttpContext.Current); %> 
     <% if (Model.CommentVotes.Count != 0) %> 
     <% { %> 
      <div class="display-label"><%= Html.Encode(Model.UpVotes)%> van de 
       <%= Html.Encode(Model.Votes)%> gaan akkoord.</div> 
       <% if (canPost) 
        { %> 
       <% if (Model.HasVoted((Guid)Membership.GetUser(Context.User.Identity.Name).ProviderUserKey) < 0) %> 
       <% { %>Stem: 
        <%= Ajax.ActionLink("-", "VoteComment", "Votes", 
         new { id = Model.id, up = false }, 
         new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
        <%= Ajax.ActionLink("+", "VoteComment", "Votes", 
         new { id = Model.id, up = true }, 
         new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
       <% } %> 
       <% else %> 
       <% { %>Wijzig stem: 
        <% if (Model.HasVoted((Guid)Membership.GetUser(Context.User.Identity.Name).ProviderUserKey) 
== 0) %> 
        <% { %> 
         <%= Ajax.ActionLink("-", "ChangeCommentVote", "Votes", 
          new { id = Model.id, up = false }, 
          new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
         <p style="color:gray; font-size:20;"">+</p> 
        <% } %> 
        <% else %> 
        <% { %> 
         <p style="color:gray; font-size:20;"">-</p> 
         <%= Ajax.ActionLink("+", "ChangeCommentVote", "Votes", 
          new { id = Model.id, up = true }, 
          new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
        <% } %> 
       <% } %> 

       <% } %> 
      <br /> 
     <% } %> 
     <% else %> 
     <% { %> 
      <div class="display-label">Nog geen stemmen</div><br /> 
      <% if (canPost) 
        { %> 

        Stem: <%= Ajax.ActionLink("-", "VoteComment", "Votes", 
         new { id = Model.id, up = false }, 
         new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
        <%= Ajax.ActionLink("+", "VoteComment", "Votes", 
         new { id = Model.id, up = true }, 
         new AjaxOptions { UpdateTargetId = "commentbox", OnSuccess = "AnimateVotebox" }, null)%> 
       <% } %> 
     <% } %> 
     <% if (HttpContext.Current.User.IsInRole("Moderator") || HttpContext.Current.User.IsInRole("Administrator"))%> 
     <% { %> 
      <%: Html.ActionLink("Geef probatie...", "ProbateUser", "Mod", new { comment = Model.id }, null) %> 
      <%: Html.ActionLink("Verwijder...", "BanUser", "Mod", new { comment = Model.id }, null) %> 
     <% } %> 

     </div> 

Notez que si je ne l'utilise jQuery le problème se produit aussi bien.

Et voici le contrôleur:

 [UserAuthorize] 
    [Authorize] 
    public ActionResult VoteComment(int id, bool up) 
    { 
     Comment comment = crep.GetComment(id); 
     CommentVote vote = new CommentVote(); 
     vote.isup = up; 
     vote.user = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey; 
     comment.CommentVotes.Add(vote); 
     crep.Save(); 
     return PartialView("CommentUserControl", crep.GetComment(id)); 
    } 

    [UserAuthorize] 
    [Authorize] 
    public ActionResult ChangeCommentVote(int id, bool up) 
    { 
     Comment comment = crep.GetComment(id); 
     CommentVote vote = comment.CommentVotes 
      .Where(v => v.user == (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey 
      && v.comment == id).SingleOrDefault(); 
     vote.isup = up; 
     crep.Save(); 
     return PartialView("CommentUserControl", crep.GetComment(id)); 
    } 

Je ne sais pas si cette question est importante, mais le usercontrol est chargé à l'intérieur d'une vue qui est lié à un contrôleur différent de celui ci-dessus. Les ActionLinks fonctionnent bien et déclenchent des actions sur VotesController.

Répondre

0

Je ne vois pas votre appel ajax, mais du petit extrait sous votre premier bloc de code, je suppose que vous utilisez jQuery. Je voyais des problèmes avec IE montrant les changements d'un rappel ajax jusqu'à ce que j'ai ajouté le drapeau "cache: false". Je suppose que si ce n'est pas le problème, cela arrive-t-il dans tous les navigateurs? Peut-être montrer votre appel ajax également.

+0

pour autant que je ne vois pas d'appel séparé est nécessaire, le ActionLink est censé prendre soin de cela. Ceci est implémenté de la même manière dans les tutoriels MVC. – Kris9000

+0

La raison pour laquelle je dis que vous devriez montrer votre appel ajax est que je ne crois pas que la page actualisera seulement une vue partielle sans un certain type de javascript. Je pourrais être loin de la base si;) Voici un exemple d'appel ajax que j'utilise pour actualiser une vue partielle dans mon propre projet sur submit. .ajax $ ({ Type: "POST", url: URL, données: datastring, cache: false, succès: function (msg) { $ (savedformparent) .fadeOut (function() {$ (ce) .html (msg) .fadeIn(); });} }); –

+0

J'ai supposé que le framework MVC s'en chargeait. Aucun des exemples d'applications besoin de faire la mise à jour parial quand même ... – Kris9000

0

Pour appeler la mise à jour partielle et invoquez action du contrôleur i utilise jQuery comme celui-ci

$.getJSON(urlModeli, null, function (data) { 
/*Do something with the data*/ 
} 

et mettre à jour le contenu par la suite.

Et j'ai eu un problème avec IE montrant le nouveau contenu, parce que j'avais cache: vrai sur les onglets qui contenaient les données que je mettais à jour afin que le navigateur cache juste l'ancienne valeur et n'affiche pas le nouveau, sauf rafraîchir

Questions connexes