Частичное обновление Ajax с частичным представлением не работает в ASP.NET MVC2

Я столкнулся с некоторыми проблемами, пытаясь заставить частичные обновления работать в ASP.NET MVC2. (Я думаю) я довольно внимательно следил за учебниками, которые нашел в Интернете, но часть Ajax не работает. Контроллер делает то, что должен, без ошибок, но страница не обновляется. Но когда я обновляю страницу, я вижу результат своих действий.

Вот код для пользовательского элемента управления, который должен обновляться:

<%@ 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>

Обратите внимание: если я не использую jQuery, проблема также возникает.

А вот и контроллер:

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

Не знаю, имеет ли это значение, но пользовательский элемент управления загружается внутри представления, связанного с другим контроллером, чем тот, который указан выше. ActionLinks работают нормально и запускают действия в VotesController.


person Kris9000    schedule 15.07.2010    source источник


Ответы (2)


Я не вижу вашего вызова ajax, но из небольшого фрагмента под первым блоком кода я предполагаю, что вы используете jQuery. У меня были проблемы с IE, показывающим изменения из обратного вызова ajax, пока я не добавил флаг «cache: false». Полагаю, если проблема не в этом, разве это происходит во всех браузерах? Возможно, также покажите свой вызов ajax.

person Neil Outler    schedule 15.07.2010
comment
Насколько я понимаю, отдельный вызов не требуется, actionlink должен позаботиться об этом. Это реализовано таким же образом в учебниках MVC. - person Kris9000; 16.07.2010
comment
Причина, по которой я говорю, что вы должны показать свой вызов ajax, заключается в том, что я не верю, что страница обновит только частичный вид без какого-либо типа javascript. Хотя я мог бы быть далеко от базы;) Вот пример вызова ajax, который я использую для обновления частичного представления в моем собственном проекте при отправке. $ .ajax ({type: POST, url: URL, data: dataString, cache: false, success: function (msg) {$ (savedformparent) .fadeOut (function () {$ (this) .html (msg) .fadeIn) ();});}}); - person Neil Outler; 16.07.2010
comment
Я предполагал, что фреймворк MVC позаботится об этом. В любом случае, ни одному из примеров приложений он не нужен для частичного обновления ... - person Kris9000; 19.07.2010
comment
Да, и проблема возникает в каждом браузере; не только IE. - person Kris9000; 19.07.2010

Чтобы вызвать частичное обновление и вызвать действие контроллера, я использую jQuery, подобный этому

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

и потом обновите содержимое.

И у меня была проблема с IE, показывающим новый контент, потому что у меня был cache: true на вкладках, содержащих данные, которые я обновлял, поэтому браузер просто кэшировал старое значение и не отображал новое, за исключением обновления

person Nikola Markezic    schedule 20.07.2010