John John
John John

Reputation: 1

asp.net mvc partial view is caching my model values

I am working on an asp.net mvc web application. and i have a WebGrid, where i added a Page-size drop-down list to enable users to select how many records they like to have per page.

the Action method is:-

 [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);
        }

and here is the repository method :-

  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;

        }

the Disposed view is :-

@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>
}

and the _disposed partial view is:-

@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

the problem i am facing is that the two parameters; currentsort + currentsortdir which are being passed as part of the javascript will not be changed,and the user will loose the current sort order if he chose to chnage the page size drop down-list. so can anyone advice what is the problem, now even if i chose to display the two values:-

Model.currentsort

&

Model.currentsortdir

they will always have the defualt value, although these values are being changed inside the repository method... but seems the partial view is somehow caching the old values for these two parameter ?

Upvotes: 1

Views: 2519

Answers (2)

ajitweb
ajitweb

Reputation: 96

I know that you have done the cache setting through ajaxSetup but try putting cache:false inside your script and see if that makes a difference.

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

Upvotes: 0

Britton
Britton

Reputation: 2981

The ModelState is probably overriding the values you changed in your model. Call ModelState.Clear() in your action method and you should see the changed values.

Upvotes: 8

Related Questions