url.action, jquery и mvc
Я создаю приложение, которое отключит сервер, пингует этот сервер и уведомит пользователя, если сервер был выключен. Если он не завершается успешно, он позволяет пользователю "Попробовать еще раз". Я могу заставить приложение правильно обрабатывать логику в первый раз, но когда я реализую функцию "Попробовать снова", она не обрабатывает действие "Завершение работы". Я думаю, что это как-то связано с кэшированием, но я недостаточно знаю об этом, чтобы знать, с чего начать поиск. Есть идеи?
Вот мой код:
контроллер
//URL: Build/Progress
public ActionResult Progress()
{
return View();
}
////URL: Build/MoveDevice
public ActionResult ShutdownStatus()
{
ImageInfo ImageInfo = new ImageInfo();
FarmInfo FarmInfo = new FarmInfo();
ProgressModel ProgressModel = new ProgressModel();
if ((Session["ShutdownStatus"] as string) == "Success")
{
ProgressModel.ShutdownStatus = 1;
return View(ProgressModel);
}
else
{
ImageInfo = svcImage.GetImageInfoByImageId(Session["ImageName"].ToString());
string Farm = ImageInfo.FarmId.ToString();
FarmInfo = svcFarm.GetFarmByFarmId(Farm);
svcImageSvc.ShutdownDevice(Session["Username"].ToString(), Session["Password"].ToString(), Session["Domain"].ToString(),
FarmInfo.farmName, ImageInfo.Device, ImageInfo.ImageHistory.Status, ImageInfo.PVSHost, ImageInfo.PVSAccount);
ProgressModel.ShutdownStatus = svcImageSvc.PingDevice(ImageInfo.Device);
return View(ProgressModel);
}
}
Просмотры (Progress.aspx)
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Progress
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h1>Progress</h1>
<hr />
<!-- Shutdown Status -->
<div class="panel" id="panel1"><img src="../../Assets/Images/load.gif" /></div>
<script type="text/javascript">
$.get('<%= Url.Action("ShutdownStatus", "Build", null) %>',
function (data) {
$('#panel1').replaceWith(data);
});
</script>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="HeaderContent" runat="server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="FooterContent" runat="server">
</asp:Content>
Просмотр (ShutdownStatus.asxc)
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PvsUtil.App.Core.Models.ProgressModel>" %>
<% using (Html.BeginForm())
{ %>
<% if (Model.ShutdownStatus == 1)
{ %>
<%: Session["ShutdownStatus"] = "Success" %>
<p>
Server shutdown succesfully
</p>
<% } %>
<% if (Model.ShutdownStatus == 2)
{ %>
<p>Server did not shutdown within 1 minute. Please check the server and try again.</p>
<%: Html.ActionLink("Try Again", "Progress", "Build") %>
<% } %>
<% if (Model.ShutdownStatus == 3)
{ %>
<p>An error has occurred. Please check the server and try again.</p>
<%: Html.ActionLink("Try Again", "Progress", "Build") %>
<% } %>
<% } %>
2 ответа
Я считаю, что кеширование на самом деле выполняется jQuery. Измените $.get на $.post и посмотрите, работает ли он. Если это так, вы все равно можете использовать $.get, но вам нужно будет установить параметр:
cache: false
HTH, Брайан
Попробуйте добавить:
[OutputCache( Location = OutputCacheLocation.None )]
к вашему контроллеру (или каждому из действий, которые вы не хотите кэшировать).
Другая вещь, которую вы хотите сделать, это обернуть ваш javascript в обработчик document.ready(). Это не является строго необходимым, поскольку ваш сценарий выполняется после элемента, на который он ссылается, но, тем не менее, это хорошая практика - и вы также можете переместить его чуть выше закрывающего тега body, но это скорее оптимизация.
<script type="text/javascript">
$(function() { // execute on document ready
$.get('<%= Url.Action("ShutdownStatus", "Build", null) %>',
function (data) {
$('#panel1').replaceWith(data);
});
});
</script>