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.
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
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(); });} }); –
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