2015-03-17 4 views
0

Я работаю над веб-приложением asp.net mvc. и у меня есть WebGrid, где я добавил раскрывающийся список размера страницы, чтобы пользователи могли выбирать, сколько записей они хотели бы иметь на странице.asp.net mvc частичный вид кэширует значения моей модели

метод Действие: -

[OutputCache(CacheProfile = "NoCache")] 
public ActionResult Disposed(string filter = null, int page = 1, int? pageSize = null, string sort = "Technology.Tag", string sortdir = "ASC") 
     { 
      GridList<DisposedResources> gridrecords = repository.GetDisposedResourcesForGrid(filter, page, pageSize, sort, sortdir, "rack"); 
      ViewBag.PagedSizeOptions = new PageOptions().FilterOptions; 
      if (Request.IsAjaxRequest()) 
      { 

       return PartialView("_disposed", gridrecords); 
      } 
      return View("Disposed", gridrecords); 
     } 

и здесь метод репозитарий: -

public GridList<DisposedResources> GetDisposedResourcesForGrid(string filter, int page, int? pageSize, string sort, string sortdir, string resourcetype) 
     { 
      if (!pageSize.HasValue) 
      { 
       pageSize = Int32.Parse(System.Web.Configuration.WebConfigurationManager.AppSettings["TechPageSize"]); 
      } 

      var records = new GridList<DisposedResources>(); 
      records.currentfilter = filter; 

      records.TotalRecords = GetDisposedResourcesForGridCount(filter, resourcetype); 
      records.hasNetworkInfo = false; 
      records.hasSystemInfo = false; 
      records.CurrentPage = page; 
      records.PageSize = pageSize.Value; 
      records.currentsort = sort; 
      records.currentsortdir = sortdir; 
      records.Content = tms.DisposedResources.Include(a=>a.Technology).Where(x => (filter == null || 
          (x.Technology.Tag.ToLower().StartsWith(filter.ToLower())) 

         ) && x.ResourceType.ToLower() == resourcetype.ToLower()) 
        .OrderBy(sort + " " + sortdir) 
        .Skip((page - 1) * pageSize.Value) 
        .Take(pageSize.Value).ToList(); 
      return records; 

     } 

проданной взгляд: -

@model S.ViewModels.GridList<S.Models.DisposedResources> 




Show @Html.DropDownList("FilterSize", new SelectList(ViewBag.PagedSizeOptions, "Value", "Text", ViewBag.pagesize), new { @id= "FilterSize1",@class="SmallDropDown3"}) <span class="hidden-phone">per page.</span> 

<div id="disposed"> 

@Html.Partial("_disposed",Model) 

</div> 

@section Scripts { 



    <script type="text/javascript"> 
     $("body").on('change', '#FilterSize1', function() { 

      //$(SizeProgressSort).show(); 
      $.ajaxSetup({ cache: false }); 
      $.ajax({ 
       type: "Get", 
       url: '@Url.Action("Disposed")', 

       data: { pageSize: $('#FilterSize1').val(), page: "1", sort: $('#currentsort').val(), sortdir: $('#currentsortdir').val() }, 

       success: successFunc, 
       error: errorFunc 
      }); 

      function successFunc(data, status) { 

       $('#disposed').html(data); 


      } 

      function errorFunc() { 
       alert('error'); 
      } 
     }); 

    </script> 
} 

и _disposed частичный вид это: -

@model S.ViewModels.GridList<S.Models.DisposedResources> 



     var gridcolumns = new List<WebGridColumn>(); 
     gridcolumns.Add(new WebGridColumn() 
     { 
      ColumnName = "Technology.Tag", 
      Header = Html.DisplayNameFor(model => model.Content.FirstOrDefault().Technology.Tag).ToString(), 
      CanSort = true 
     }); 
     //code goes here... 
      var grid = new WebGrid(
         canPage: true, 
         rowsPerPage: Model.PageSize, 
         canSort: true, 
         ajaxUpdateContainerId: "grid"); 

      grid.Bind(Model.Content, rowCount: Model.TotalRecords, autoSortAndPage: false); 
      grid.Pager(WebGridPagerModes.All); 

      @grid.GetHtml(htmlAttributes: new { id = "grid" }, // id for ajaxUpdateContainerId parameter 
      fillEmptyRows: false, 
      tableStyle: "table table-bordered table-hover", 
      mode: WebGridPagerModes.All, 
      columns: gridcolumns 

      ); 
      } 
      </div></div></div> 
<input type="hidden" value="@Model.currentsort" id="currentsort" /> @Model.currentsort 
<input type="hidden" value="@Model.currentsortdir" id="currentsortdir" /> @Model.currentsortdir 

проблема, с которой я столкнулся, заключается в том, что два параметра; currentsort + currentsortdir, которые передаются как часть javascript, не будут изменены, и пользователь потеряет текущий порядок сортировки, если он захочет изменить раскрывающийся список размера страницы. так может кто-нибудь совет, что это проблема, теперь, даже если я выбрал, чтобы отобразить два значения: -

Model.currentsort 

& 

Model.currentsortdir 

они всегда будут иметь значение DEFUALT, хотя эти значения меняются внутри метода хранилища ... но кажется, частичный вид каким-то образом кэширует старые значения для этих двух параметров?

ответ

1

ModelState, вероятно, переопределяет значения, которые вы изменили в своей модели. Вызовите ModelState.Clear() в своем методе действий, и вы увидите измененные значения.

+0

ok Я попробовал вызов ModelState.Clear(); в начале моего действия, но не решила проблему, это действительно странно! может ли webgrid вызвать эту проблему? –

+0

У меня такое ощущение, что это ошибка в представлении Razor, теперь я использую asp.net mvc 5.2.2 с версией Razor версии 3.0.0. –

+0

После долгих попыток выяснить, почему моя страница, похоже, кэшировалась, хотя я сказал, что это не слишком сработало, – Tyddlywink

0

Я знаю, что вы выполнили настройку кеша через ajaxSetup, но попробуйте положить кеш: false внутри вашего скрипта и посмотреть, не изменилось ли это.

 $.ajax({ 
      cache: false 
      type: "Get", 
      url: '@Url.Action("Disposed")', 
      -------- 
+0

, как я упоминал ранее, даже когда я показываю значение внутри моего представления (например, Model.currentsort & Model.currentsortdir), я получаю старые значения, и они никогда не chnage, , поэтому в javascript может возникнуть проблема кэширования, но в настоящее время даже значения модели не обновляются. –

+0

ok Я добавил кеш: false, но это не устранило проблему. –

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