Telerik Grid для ASP.NET MVC2 Ajax Binding не работает / не выполняет неправильные действия

Gird загружает b / c привязок к серверу. Все остальные действия либо отправляются по неправильному маршруту, либо к действию по умолчанию: Вставить сообщения в действие / EditOrder Отредактируйте сообщения по этому адресу: http://localhost:20588/Orders/EditOrder/sdsddd?OrderID=2&CustomerID=1&ItemsInOrderGrid-mode=edit, что бессмысленно (sdsddd - это ItemID ) не достигаются точки останова внутри секций AJAX в контроллере. Есть идеи, что я делаю не так?

Спасибо, Дэни

вот код просмотра:

 <%=
                Html.Telerik().Grid(Model.ItemsInOrderList)
                    .Name("ItemsInOrderGrid")
                                    .DataKeys(dataKeys =>
                                    {
                                        dataKeys.Add(e => e.OrderID);
                                        dataKeys.Add(e => e.ItemID);
                                    })
                    .ToolBar(commands => commands.Insert())
                    .DataBinding(dataBinding =>
                        dataBinding.Ajax()    //Ajax binding
                .Select("ItemsGridAjax", "Orders", new {OrderID = Model.order.OrderID})
                .Insert("InsertItemsGridAjax", "Orders", new {OrderID = Model.order.OrderID})
                .Update("UpdateItemsGridAjax", "Orders")
                .Delete("DeleteItemsGridAjax", "Orders"))
                    //.BindTo(Model.ItemsInOrderList)
                    .Columns(c =>
                        {
                            c.Bound(o => o.ItemID);
                            c.Bound(o => o.OrderID).Column.Visible = false;
                            c.Bound(o => o.ItemDescription);
                            c.Bound(o => o.NumOfItems);
                            c.Bound(o => o.CostOfItem);
                            c.Bound(o => o.TotalCost);
                            c.Bound(o => o.SupplyDate);
                            c.Command(commands =>
                                {
                                    commands.Edit();
                                    commands.Delete();
                                }).Width(200);
                        })

            %>

Вот код в контроллере:

[GridAction]    
public ActionResult ItemsGridAjax(int OrderID)       
{          
return View(ordersRepository.GetOrderItemsTK(OrderID));     
}

[HttpPost]
        [GridAction]
        public ActionResult InsertItemdGridAjax(int OrderID)
        {
            //Create a new instance of the EditableCustomer class.
            ItemsInOrder newItem = ItemsInOrder.CreateItemsInOrder(OrderID, "");
            newItem.OrderID = OrderID;

            //Perform model binding (fill the customer properties and validate it).
            if (TryUpdateModel(newItem))
            {
                //The model is valid - insert the customer.
                bool res = ordersRepository.InsertItemToOrder(OrderID, newItem);
            }

            //Rebind the grid
            return View(ordersRepository.GetOrderItemsTK(OrderID));
        }



[HttpPost]
  [GridAction]
  public ActionResult UpdateItemsGridAjax(int OrderID, string ItemID)
  {
      //Find a customer whose CustomerID is equal to the id action parameter
      ItemsInOrder item = ordersRepository.FindItemByID(OrderID,ItemID);

      if (item != null)
      {
          //Perform model binding (fill the customer properties and validate it).
          if (TryUpdateModel(item))
          {
              //The model is valid - update the customer and redisplay the grid.
              ordersRepository.UpdateItem(item);
          }
      }
      // TODO: Add try-catch with error reporting.
      //Rebind the grid
      return View(ordersRepository.GetOrderItemsTK(OrderID));
  }

[HttpPost]
        [GridAction]
        public ActionResult DeleteItemsGridAjax(int OrderID, string ItemID)
        {
            //Find the customer with the specified id
            ItemsInOrder item = ordersRepository.FindItemByID(OrderID, ItemID);

            if (item != null)
            {
                //Delete the customer
                ordersRepository.DeleteItem(item);
            }

            //Rebind the grid
            return View(ordersRepository.GetOrderItemsTK(OrderID));
        }

person Dani    schedule 12.01.2011    source источник


Ответы (2)


Я не уверен, нужен ли вам атрибут [HttpPost] (я думаю, что просто [GridAction] будет достаточно) для этих действий Ajax, возможно, попробуйте удалить их и посмотреть, решит ли это проблему.

Если это не помогло, попробуйте вернуть GridModel в своих действиях следующим образом:

        [GridAction]
        public ActionResult InsertItemdGridAjax(int OrderID)
        {
            //Omitted Code

           return View(new GridModel(ordersRepository.GetOrderItemsTK(OrderID)));
        }

Вы также можете использовать синтаксис, подобный следующему (поскольку я думаю, что GridModel любит иметь total):

        [GridAction]
        public ActionResult InsertItemdGridAjax(int OrderID)
        {
            //Omitted Code

            //Get List of Order Items
            List<OrderItem> list = ordersRepository.GetOrderItemsTK(OrderID));

            return View(new GridModel
            {
                Data = list,
                Total = list.Count
            });
        }
person Rion Williams    schedule 12.01.2011
comment
нет, не помогло. Это похоже на то, что AJAX отключен, и он переходит к публикации на всю страницу. первый вызов AJAX - ItemsGridAjax не вызывается, поэтому я получаю пустую сетку. если я обрабатываю его через привязки к серверу (давая сетке список ItemsInOrder в ctor, как в примере - это единственное, что работает, а затем я вижу, что редактирование и удаление также не работают ... ) - person Dani; 12.01.2011
comment
Я сомневаюсь, что это сработает, но попробовать стоит. Возможно, замените [HttpPost] на [AcceptVerbs (HttpVerbs.Post)]? Понятия не имею, будет ли это вообще иметь значение :) - person Rion Williams; 12.01.2011
comment
А, я думаю, что понял это - вы возвращаете View, а не GridModel - я добавлю его код, но я думаю, что это может исправить. - person Rion Williams; 12.01.2011
comment
Спасибо, но это не помогло. Я добавил это, хотя, как я вижу в примере Telerik, это должно быть так (но не в документации). Я установил точки останова для всех функций AJAX, они даже не достигаются, редактирование / вставка публикует всю страницу с другим параметр, который не обрабатывается: localhost: 20588 / Orders / - person Dani; 12.01.2011
comment
Мне интересно, не упоминаются ли некоторые из необходимых файлов Ajax / Telerik. Раньше я сталкивался с несколькими проблемами с некоторыми из их компонентов, почти все из которых требовали от меня ссылки на определенные файлы. К счастью, у них отличная документация, а форумы очень быстрые / активные. - person Rion Williams; 12.01.2011
comment
Я следил за документами ... Я также разместил это на их форуме. ссылаясь на их dll, а js находятся в моей папке сценариев. - person Dani; 12.01.2011
comment
Что ж, я кое-что нашел (отсюда и +1) - я открыл новый проект и скопировал только код контроллера, и представление, и ajax начали работать (теперь мне нужно иметь дело с ошибкой 500), но я думаю, вы правы , это было что-то в окружающей среде ... неизвестно что. - person Dani; 12.01.2011
comment
Если я правильно помню - ошибка 500 обычно возникает из-за того, что вам не хватает GridAction в одном из действий вашего контроллера. :) - person Rion Williams; 12.01.2011
comment
Не в этом случае :-), но я приму ответ, поскольку третий комментарий привел меня к решению (воссоздайте проект ...). Я открою новый вопрос об ошибке 500, так как это другая проблема. - person Dani; 13.01.2011

У A была такая же проблема, но в MVC 3

Решением было просто добавить в проект соответствующие сценарии * .js, см. this и добавьте @(Html.Telerik().ScriptRegistrar().jQuery(false)) в конец файла _Layout.cshtml

А тогда маршрутизация идет нормально!

person Tomas    schedule 18.12.2011