I have a grid with some data. It looks like this picture.

enter image description here

When I select a few rows to delete and click the delete button, in the delete button I make an ajax call to a server side action. The server side action removes the selected categories from the database, and also removes them from the in-memory cache it maintains.

Then, it redirects to an action which returns the partial view that has the categories grid, giving to it the updated model.

However, when we see the grid after the server side action has successfully completed, it still maintains its old display, i.e. the rows we just deleted still appear in the grid as selected rows.

Here are the relevant pieces of code.

Server side:

[HttpPost]
        public ActionResult Delete(long[] categoryIds)
        {
            if (categoryIds != null && categoryIds.Length > 0)
            {
                foreach (var categoryId in categoryIds)
                {
                    Category.Delete(categoryId);

                    DeleteFromCachedCategories(categoryId);
                }
            }

            return PartialView("_CategoriesPartial", GetCategoryList());
        }


private IEnumerable<Category> GetCategoryList()
        {
            lock (padLock)
            {
                if (CacheManager.Contains(CacheKeys.AllCategories))
                {
                    return CacheManager.Get<IEnumerable<Category>>(CacheKeys.AllCategories);
                }
            }

            var list = Category.All as List<Category>;
            if (!list.Contains(Category.Empty)) list.Insert(0, Category.Empty);

            lock (padLock)
            {
                CacheManager.Add(CacheKeys.AllCategories, list);
            }

            return list;
        }

        private void UpdateCachedCategories(Category category)
        {
            var categories = CacheManager.Get<List<Category>>(CacheKeys.AllCategories);

            if (categories != null)
            {
                if (categories.AsEnumerable().Contains(category, Category.CategoryIdComparer))
                {
                    var cachedCategory = categories.SingleOrDefault(c => c.Id == category.Id);

                    cachedCategory.Name = category.Name ?? string.Empty;
                }
                else
                {
                    categories.Add(category);
                }
            }
        }

        private void DeleteFromCachedCategories(long categoryId)
        {
            var categories = CacheManager.Get<List<Category>>(CacheKeys.AllCategories);

            if (categories != null)
            {
                var index = categories.FindIndex(c => c.Id == categoryId);

                if (index >= 0)
                    categories.RemoveAt(index);
            }
        }

View (razor): [_CategoriesPartial.cshtml]

@using System.Web.UI.WebControls;
@using System.Data;
@model IEnumerable<GlobalizationUI.BusinessObjects.Category>

@Html.DevExpress().GridView(settings =>
    {
        settings.Name = "gvCategories";

        settings.CallbackRouteValues = new { Controller = "Category", Action = "CategoriesPartial" };

        settings.Width = 1200;

        settings.SettingsPager.Position = PagerPosition.TopAndBottom;
        settings.SettingsPager.FirstPageButton.Visible = true;
        settings.SettingsPager.LastPageButton.Visible = true;
        settings.SettingsPager.PageSizeItemSettings.Visible = true;
        settings.SettingsPager.PageSizeItemSettings.Items = new string[] { "10", "20", "50", "100", "200" };
        settings.SettingsPager.PageSize = 50;

        settings.Settings.ShowFilterRow = true;
        settings.Settings.ShowFilterRowMenu = true;

        settings.CommandColumn.Visible = true;
        settings.CommandColumn.ClearFilterButton.Visible = true;
        settings.CommandColumn.ShowSelectCheckbox = true;

        settings.Settings.ShowHeaderFilterButton = true;

        settings.KeyFieldName = "Id";

        settings.Columns.Add("Name");

        settings.SettingsEditing.AddNewRowRouteValues = new { Controller = "Category", Action = "CreateNew" };
        settings.SettingsEditing.UpdateRowRouteValues = new { Controller = "Category", Action = "Edit" };

        settings.SettingsEditing.Mode = GridViewEditingMode.Inline;

        settings.CommandColumn.Visible = true;
        settings.CommandColumn.NewButton.Visible = true;
        settings.CommandColumn.EditButton.Visible = true;
        settings.CommandColumn.UpdateButton.Visible = true;

    }).Bind(Model).GetHtml()

Relevant snippet out of the container view: [Index.cshtml]

@model IEnumerable<GlobalizationUI.BusinessObjects.Category>

@Html.Partial("_CategoriesPartial", Model)

<script type = "text/javascript">
//<![CDATA[
    $(document).ready(
        function () {
            WireHandlers();
        }
    );

    function DeleteCategories(selectedCategoriesArray) {

        if (selectedCategoriesArray.length == 0) return;

        debugger;

        var url = '/Category/Delete';

        $.ajax(url,
        {
            cache: false, async: false, type: 'POST',
            data: JSON.stringify({ categoryIds: selectedCategoriesArray }), dataType: 'json',
            contentType: 'application/json', traditional: true,
            error: OnError, success: OnSuccess
        });

        function OnSuccess(data, textStatus, jqXHR) {
            debugger;
        }

        function OnError(jqXHR, textStatus, errorThrown) {
        }
    }

    function DeleteSelectedCategories() {
        if (gvCategories.GetSelectedRowCount() == 0) return;

        gvCategories.GetSelectedFieldValues('Id', DeleteCategories);
    }

    function WireHandlers() {
        $('#btnDeleteCategory').unbind("click").click(DeleteSelectedCategories);
    }
// ]]>
</script>

I am using DevExpress Extensions v12.2.10.0 for ASP.NET MVC 4 on a Windows 7 Home Premium 64-bit machine.

1

There are 1 best solutions below

0
On

Try to call the Grid's client gvCategories.Refresh() method after callback to the server.

If this doesn't help, set grid's GridViewSettings.EnableRowsCache property value to false.

You can also take a look at this thread (it describes nearly the same issue): https://www.devexpress.com/Support/Center/Question/Details/Q316778