2017-01-26 3 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

Добро пожаловать. Часто люди используют POST вместо GET, чтобы избежать проблем с кешированием. – buffjape

Смежные вопросы