#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
на странице для дальнейшего использования.