Форматирование потеряно при обновлении строки jqGrid

#javascript #jquery #asp.net-mvc-3 #jqgrid

#javascript #jquery #asp.net-mvc-3 #jqgrid

Вопрос:

Я отображаю таблицу рецептов jqGrid и предоставляю пользователю представление типа master-details. Когда пользователь выбирает рецепт из сетки, он отображает детали этого рецепта в div под сеткой. Затем я предоставляю возможность редактирования на месте внутри этого div. Когда пользователь сохраняет изменения, я повторно отображаю детали в рецепте. Все это работает достаточно хорошо. Теперь выбранная строка сетки может содержать данные, которые не соответствуют тому, что отображается в деталях после обновления, поэтому я делаю что-то вроде этого, чтобы обновить сетку:

 $.ajax({
   type: "GET",
   data: "id=" recipeId,
   url:  '@Url.Action("GetGridDataForRecipe", "Recipe")',
   dataType: "json",
   success: function (result) {
      var myGrid = $("#recipeGrid");
      var selRowId = myGrid.jqGrid('getGridParam', 'selrow');
      myGrid.jqGrid('setRowData', selRowId, result);
   }
});
  

Мое действие контроллера выглядит так:

 public JsonResult GetGridDataForRecipe(int id)
{
   // ...
   var recipeData = context.recipes.Where(m => m.RecipeId == id).Select(row => new
   {
      RecipeId = row.RecipeId,
      RecipeName = row.RecipeName,
      RecipeDate = row.RecipeDate,
   }).First();
   return Json(recipeData, JsonRequestBehavior.AllowGet);
}
  

Итак, обновление работает почти идеально, за исключением того, что запись RecipeDate в конечном итоге отображается следующим образом:

 /Date(1317182400000)/
  

вместо форматированной даты:

 10/03/2011
  

это я указал в colModel , когда я возвращаю строки сетки:

 { name: 'RecipeDate', index: 'RecipeDate', width: 120, align: 'left', sorttype: 'date',
   formatter: 'date', formatoptions: { newformat: 'm/d/Y'},
...
  

Здесь есть разрыв между colModel тем, что я указал при отображении сетки, и данными, которые я обновляю позже. Нужно ли повторно указывать эту информацию? Как мне это сделать?

Ответ №1:

Нужно ли повторно указывать эту информацию?

ДА.

Как мне это сделать?

Вы можете выполнить это форматирование в анонимном объекте, который вы возвращаете из действия вашего контроллера:

 var recipeData = context.recipes.Where(m => m.RecipeId == id).Select(row => new
{
    RecipeId = row.RecipeId,
    RecipeName = row.RecipeName,
    RecipeDate = row.RecipeDate.ToString("MM/dd/yyyy"),
}).First();
  

Комментарии:

1. Спасибо, Дарин, теперь это было намного проще, чем я предполагал. Отлично работает.

2. Для этого ответа требуется дублировать код форматирования на стороне сервера, что далеко не идеально. Я буду продолжать искать.

Ответ №2:

Нашел ответ на GitHub.

Добавление $.jgrid.formatter.date.reformatAfterEdit = true; перед тем, как я вызову setRowData, на данный момент кажется хорошим решением.

Я добавил этот код, и теперь мои даты отформатированы так, как я ожидаю.