Загрузка частичного представления при нажатии кнопки срабатывает только при первом нажатии

#asp.net-mvc #model-view-controller #twitter-bootstrap-3 #partial-views

#asp.net-mvc #модель-представление-контроллер #twitter-bootstrap-3 #частичные просмотры

Вопрос:

У меня есть следующий код:

 @model pedidosOnlineMVC.Models.SuperUser
@{
    ViewBag.Title = "MySystem";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Administration</h2>
@Html.AntiForgeryToken()
@using(var p = Html.Bootstrap().Begin(new Panel()))
{   
    using (p.BeginBody())
    {
        @Html.Bootstrap().Button().Text("Register new  administrator").Id("btnReg")
        @Html.Bootstrap().Button().Text("List administrators").Id("btnList")
        @Html.Bootstrap().Button().Text("Search administrator").Id("btnSeek")   
        using (var ip = Html.Bootstrap().Begin(new Panel()))
        {
            using (ip.BeginBody())
            {
                <div id="partials">
                </div>
            }
        }     
    }
}
 

И правильный код jQuery:

 $(document).ready(
            function () {
                $('#btnReg').click(function () {
                    $.get('@Url.Action("partialRegAdmin", "SuperUser")', function (data) {
                        $('#partials').replaceWith(data);
                    });
                });
                $('#btnList').click(function () {
                    $.get('@Url.Action("partialListAdmin", "SuperUser")', function (data) {
                        $('#partials').replaceWith(data);
                    });
                });
                $('#btnSeek').click(function () {
                    $.get('@Url.Action("partialSeekAdmin", "SuperUser")', function (data) {
                        $('#partials').replaceWith(data);
                    });
                });
            });
 

И он отлично работает при первом нажатии любой из трех кнопок, но после нажатия одной две другие больше не будут работать.
Я прочитал несколько сообщений здесь, в которых говорилось, что это может быть проблема с кэшированием, поэтому я попытался использовать $.ajax({cache: false}) , попытался использовать [OutputCache(Duration = 0)] , попытался создать следующий атрибут:

 public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 0));
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
 

Все бесполезно… Кто-нибудь имеет представление о том, что может быть не так?


Редактировать: запрошенный код для частичного представления partialRegAdmin:

 @model pedidosOnlineMVC.Models.Administrador
@using (var f = Html.Bootstrap().Begin(new Form()))
{
    @f.FormGroup().CustomControls(Html.AntiForgeryToken())
    @f.FormGroup().TextBoxFor(model=>model.nome)
    @f.FormGroup().TextBoxFor(model=>model.cpf).Data(new {mask="999.999.999-99"})
    @f.FormGroup().TextBoxFor(model=>model.telefone)
    @f.FormGroup().TextBoxFor(model=>model.login)
    @f.FormGroup().PasswordFor(model=>model.senha)
    @f.FormGroup().CustomControls(@Html.Bootstrap().SubmitButton().Text("Cadastrar"))
}
 

Комментарии:

1. Я предполагаю partialRegAdmin , что и другие возвращают какой-то HTML, построенный на каком-то представлении, верно? Можете ли вы опубликовать этот код представления?

2. Вы имеете в виду код контроллера или фактический PartialView код cshtml?

3. Отредактировано. Все части следуют аналогичной структуре

Ответ №1:

Вы хотите

 $('#partials').html(data);
 

вместо

 $('#partials').replaceWith(data);
 

В основном, когда вы нажимаете в первый раз, #partials на странице полностью заменяется любой html, возвращаемый с сервера. Поскольку ваш PartialView не содержит элемента с идентификатором partials , последующие вызовы $('#partials') ничего не находят, поэтому ничего не заменяется.

html с другой стороны, заменит содержимое, оставив partials на странице для дальнейшего использования.