url.action, jquery и mvc - PullRequest
       7

url.action, jquery и mvc

1 голос
/ 02 декабря 2010

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

Вот мой код:

Контроллер

    //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 ]

3 голосов
/ 02 декабря 2010

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

cache: false

НТН, Brian

0 голосов
/ 02 декабря 2010

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

[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>
...