2010-12-02 4 views
1

Я создаю приложение, которое остановит сервер, проверит этот сервер и уведомит пользователя, если сервер был выключен. Если он не завершает работу, он позволяет пользователю «Попробовать снова». Я могу получить приложение для правильной обработки логики в первый раз, но когда я реализую функцию «Попробовать снова», она не перерабатывает действие «Завершение работы». Я думаю, что это должно иметь какое-то отношение к кешированию, но я не знаю достаточно об этом, чтобы знать, с чего начать искать. Есть идеи?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> 

View (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") %> 
     <% } %> 
    <% } %> 

ответ

3

Я считаю, что кеширование выполняется jQuery. Измените $ .get на $ .post и посмотрите, работает ли он. Если это произойдет, вы можете использовать $ .get, но вам нужно будет установить опцию:

cache: false 

HTH, Брайан

+1

+1 Internet Explorer особенно любит кэшировать запросы GET. Самый простой способ - обычно использовать POST. Спецификация HTTP говорит, что GET следует использовать только для запросов, которые не влияют. Поскольку этот запрос должен изменить состояние сервера, он определенно должен быть POST. – StriplingWarrior 2010-12-02 20:55:06

0

Попробуйте добавить:

[OutputCache(Location = OutputCacheLocation.None)] 

к вашему контроллеру (или к каждому из действий, которые вы не хотите кэшировать).

Другая вещь, которую вы хотите сделать, - это обернуть ваш javascript в обработчик document.ready(). Это не является строго необходимым, так как ваш скрипт возникает после элемента, который он ссылается, но это хорошая практика, тем не менее - и вы также можете переместить его чуть выше закрывающего тега тела, но это скорее оптимизация.

<script type="text/javascript"> 
    $(function() { // execute on document ready 
     $.get('<%= Url.Action("ShutdownStatus", "Build", null) %>', 
     function (data) { 
      $('#panel1').replaceWith(data); 
     }); 
    }); 
</script> 
+0

Спасибо за эту информацию, а также ... очень полезно для понимания процесса – bcahill 2010-12-02 21:30:00