2017-01-26 11 views
-1

MVCアプリケーションをクエリすると、コードが実行され、関連するデータが返されますが、システムの別の部分を使用して数秒後にデータを追加すると、元のユーザーが同じセッションにあるため、コードは、コントローラがキャッシュされた結果を戻しているかのようにデータベースに再照会されないため、さまざまな結果を戻します。それらがログアウトしてブラウザを閉じてから再び開始すると、新しい結果が得られます。ASP.Net MVCスクリプトが常時動作しない

データベースを常に再クエリできるようにするにはどうすればよいですか?

CSHTMLコード:

@Scripts.Render("~/bundles/jquery") 
@Scripts.Render("~/bundles/bootstrap") 
@RenderSection("scripts", required: false) 
<script async type="text/javascript"> 
    $(function() { 
     $("#SelecteZoneId").on("change", function() { 
      var zoneId = $(this).val(); 
      var vrnUrl = "@Url.Action("GetVRNListForZone", "Check")?zoneId=" + zoneId; 
      $.get(vrnUrl, function (data) { 
       var $vehicleList = $("#vehicles"); 
       $("#vehicles").find(".list-group-item").remove(); 
       $.each(data, function (idx, item) { 
        $vehicleList.append("<li class=\"list-group-item\">" + item + "</list>"); 
       }); 
      }); 
     }); 

     $("#search").on("click", function() { 
      var vrnVal = $("#vrn-id").val(); 
      var vrnUrl = "@Url.Action("GetVehicle", "Check")?vrn=" + vrnVal; 
      $.get(vrnUrl, function (data) { 
       $("#vehicle").find("li:eq(0)").html("<label>VRN:&nbsp;</label>"); 
       $("#vehicle").find("li:eq(1)").html("<label>Is Shared Vehicle:&nbsp;</label>"); 
       $("#vehicle").find("li:eq(2)").html("<label>Permit:&nbsp;</label>"); 
       $("#vehicle").find("li:eq(3)").html("<label>Permit Valid In Zones:&nbsp;</label>"); 
       $("#vehicle").find("li:eq(4)").html("<label>Last Parked:&nbsp;</label>"); 
       if (!!data) { 
        $("#vehicle").find("li:eq(0)").html("<label>VRN:&nbsp;</label>" + data["VRN"]); 
        $("#vehicle").find("li:eq(1)").html("<label>Is Shared Vehicle:&nbsp;</label>" + data["IsSharedVehicle"]); 
        $("#vehicle").find("li:eq(2)").html("<label>Permit:&nbsp;</label>" + data["PermitNr"]); 
        $("#vehicle").find("li:eq(3)").html("<label>Permit Valid In Zones:&nbsp;</label>" + data["Zones"]); 
        $("#vehicle").find("li:eq(4)").html("<label>Last Parked:&nbsp;</label>" + data["pDate"]); 
       } 
      }); 
     }); 
    }); 
</script> 

は.csコード:

public JsonResult GetVRNListForZone(int? zoneId) 
    { 
     JsonResult json = null; 
     IList<string> vrnList = null; 

     if (zoneId == null) 
     { 
      vrnList = DbContext.tblSessions 
           .Where(x => x.CouncilId == Council.Id && !x.ExpireTicket && this.EndOfDayYesterday < x.ParkedOn) 
           .Select(v => v.tblVehicle.RegistrationNumber).ToList(); 
     } 
     else 
     { 
      vrnList = DbContext.tblSessions 
           .Where(x => x.ZoneId == zoneId.Value && !x.ExpireTicket && this.EndOfDayYesterday < x.ParkedOn) 
           .Select(v => v.tblVehicle.RegistrationNumber).ToList(); 
     } 

     if (vrnList.Any()) 
     { 
      json = Json(vrnList, JsonRequestBehavior.AllowGet); 
     } 

     return json; 
    } 

    public JsonResult GetVehicle(string vrn) 
    { 
     JsonResult json = null; 

     var endOfPreviousDay = DateTime.Now.AddDays(-1).EndOfDay(); 
     var session = DbContext.tblSessions.Include(x => x.tblPermit) 
           .Where(x => x.CouncilId == Council.Id && x.tblVehicle.IsActive && x.tblVehicle.RegistrationNumber == vrn) 
           //.Where(x => x.CouncilId == Council.Id && x.tblVehicle.IsActive && x.tblVehicle.RegistrationNumber == vrn && endOfPreviousDay < x.ParkedOn) 
           .OrderByDescending(x => x.ParkedOn) 
           .FirstOrDefault(); 
     if (session != null) 
     { 
      var parkingDetails = new ParkingDetails() 
      { 
       SharedVehicleId = session.SharedVehicleId, 
       PermitId = session.PermitId, 
       ParkedOn = session.ParkedOn, 
       PermitSn = session.tblPermit.PermitSn 
      }; 

      var zones = session.tblPermit.tblZones.Select(x => x.ZoneName).ToList(); 

      string isSharedVehicle = "Yes"; 
      if (parkingDetails.SharedVehicleId == null) 
      { 
       isSharedVehicle = "No"; 
      } 

      json = Json(new 
      { 
       VRN = vrn.ToUpper() + ((session.PdParking) ? " (P+D Parking)" : ""), 
       IsSharedVehicle = isSharedVehicle, 
       PermitNr = parkingDetails.PermitSn, 
       Zones = string.Join(", ", zones), 
       pDate = parkingDetails.ParkedOn.ToString("dd/MMM/yyyy") 
      }, JsonRequestBehavior.AllowGet); 
      return json; 
     } 
     var vehicle = DbContext.tblUserVehicles.FirstOrDefault(u => u.tblVehicle.RegistrationNumber == vrn && u.tblUser.IsActive); 
     if (vehicle != null) 
     { 
      var userData = Council.tblUsers.FirstOrDefault(u => u.Id == vehicle.IdUser && u.IsActive); 
      if (userData != null) 
      { 
       var permit = DbContext.tblPermits.Find(userData.ActivePermit); 
       var parkingDetails = new ParkingDetails() 
       { 
        SharedVehicleId = 0, 
        PermitId = permit.Id, 
        PermitSn = permit.PermitSn 
       }; 
       var zones = permit.tblZones.Select(x => x.ZoneName).ToList(); 
       json = Json(new 
       { 
        VRN = vrn.ToUpper(), 
        IsSharedVehicle = "No", 
        PermitNr = parkingDetails.PermitSn, 
        Zones = string.Join(", ", zones), 
        pDate = "" 
       }, JsonRequestBehavior.AllowGet); 
       return json; 
      } 
     } 
     json = Json(new 
     { 
      VRN = "Not Found", 
      IsSharedVehicle = "No", 
      PermitNr = "", 
      Zones = "", 
      pDate = "" 
     }, JsonRequestBehavior.AllowGet); 
     return json; 
    } 
+1

読む[尋ねる]とタイトルに –

答えて

0

jQueryのは、デフォルトではAJAXの応答をキャッシュします。 。あなたは代わりに$.ajaxを使用して設定でcache: falseを設定することで、たとえばあなたが合格しなければならないオブジェクトのことを無効にすることができます。

$.ajax({ 
    url: vrnUrl, 
    method: 'GET', 
    cache: false, 
    success: function (data) { 
     var $vehicleList = $("#vehicles"); 
     $("#vehicles").find(".list-group-item").remove(); 
     $.each(data, function (idx, item) { 
      $vehicleList.append("<li class=\"list-group-item\">" + item + "</list>"); 
     }); 
    }) 
}); 

注:技術的には、jQueryのそれ以降のバージョンでは、あなたはまだ$.getを使用することができますが、あなたが持っているように$.ajaxと同じ設定オブジェクトを渡すには、$.ajaxを使用するだけで、バージョンの互換性について心配する必要はありません。

+0

感謝を更新してください。これは完全に機能し、私のサイトの全体をオフに切り替える方法を指摘 – user3328488

0

私の質問に対する回答を検索している間に、それを完全に無効にする最も簡単な方法は、常にテーブルからデータを取得するcshtmlページで以下のコードを使用することでした。

$ .ajaxSetup({cache:false});

0

あなたはアクションでキャッシュを無効にすることができます

[OutputCache(VaryByParam = "*", Duration = 0, NoStore = true)] 
public JsonResult GetVehicle(string vrn) 
{ 
    ... 
} 

または全体のコントローラ用:

[OutputCache(VaryByParam = "*", Duration = 0, NoStore = true)] 
public class CheckController : Controller 
{ 
    ... 
} 
+0

ありがとう。それは知っていると非常に便利です。私は最近MVCを始めたばかりで、これは非常に便利です。 – user3328488

+0

ようこそ。多くの場合、GETではなくPOSTを使用して、キャッシュの問題を回避します。 – buffjape