2014-02-13 1 views
2

Я работаю над сеткой в ​​моем приложении mpc asp.net, которому необходимо получить список объектов из существующей службы. Ранее я заполнил эту сетку, вызвав службу, используя код .net в моем контроллере. Однако, поскольку структура проекта, над которым я работаю, является chaning, мне нужно вызвать услугу непосредственно из сети. Я изменил свою реализацию, используя обертки сервера только для javascript;400 плохой запрос при вызове моего сервиса из сетки Kendo

<div id="grid"></div> 
      <script> 
       $(document).ready(function() { 
        $("#grid").kendoGrid({ 
         dataSource: { 
          type: "odata", 
          transport: { 
           read: { 
            type: "GET", 
            url: "http://idex-c1/idex/Unit/AlarmService.svc/GetAlarmsForUnit", 
            data: { 
             unitId: "1", 
             fromDate: "", 
             toDate: false 
            } 
           } 
          }, 
          schema: { 
           model: { 
            fields: { 
             UnitId: { type: "number" } 
            } 
           } 
          }, 
          pageSize: 20, 
          serverPaging: true, 
          serverFiltering: true, 
          serverSorting: true 
         }, 
         height: 430, 
         filterable: true, 
         sortable: true, 
         pageable: true, 
         columns: [ 
          { 
           field: "UnitId", 
           filterable: false 
          } 
         ] 
        }); 
       }); 
      </script> 
     </div> 

Мой первый вопрос заключается в следующем: Служба обычно возвращает список AlarmContracts с несколькими свойствами. Должна ли моя сетка знать обо всех этих свойствах, или я могу использовать только некоторые из них (как в этом случае, идентификатор)?

Во-вторых: Почему у меня возникает запрос 400 - Bad при попытке вызвать услугу? Как я уже говорил, вызов службы через .net-код в контроллере работает;

public ActionResult Alarms(int id, DateTime? FromDate, DateTime? ToDate) 
{ 
    var unit = UnitClient.GetUnit(id); 

    var fromDate = FromDate ?? DateTime.Today.AddDays(-20); 
    var toDate = ToDate ?? DateTime.Now; 
    Model = new AlarmsViewModel 
    { 
     ViewUnitContract = UnitClient.GetUnit(id), 
     Alarms = AlarmClient.GetAlarmsForUnit(unit.Name, fromDate, toDate) 
        .Where(x => x.DateOff == null || x.DateAck == null) 
        .ToArray(), 
     UnitName = unit.Name, 
     Unit = new UnitDetailsModel(unit), 
     FromTime = fromDate, 
     ToTime = toDate 
    }; 

    return View(Model); 
} 
+0

Можете ли вы добавить трассировку скрипача для вызова? Правило запроса и ответа будет отличным –

+0

Как я могу получить один из них? :) –

+0

Привет, вы, кажется, решили. Но вы можете использовать инструмент под названием fiddler для захвата следа. Вы можете использовать инструменты chrome dev. Нажмите F12 в Chrome, щелкните вкладку «Сеть» в верхней части панели, которая появится, щелкните фильтр XHR внизу (нижние вкладки). Это должно показать вам, какие вызовы стиля ajax были сделаны с вашей страницы. Из этого вы можете захватить заголовки запроса и ответа и использовать их в качестве способа проверить, что связано с приложением. –

ответ

1

Хорошо, так что я на самом деле удалось выяснить, решение этой проблемы, используя упаковщики в конце концов :) Вот что я сделал в моей cshtml:

@(Html.Kendo().Grid(Model.Alarms) 
        .Name("grid") 
        .DataSource(dataSource => dataSource 
         .Ajax() 
         .ServerOperation(false) 
         .Model(m => m.Id(s => s.AlarmComment)) 
         .Read(read => read.Action("Alarms_Read", "Alarms", new { id = Model.ViewUnitContract.Id }).Type(HttpVerbs.Get)) 
         .AutoSync(true) 
       ) 
        .Columns(col => 
        { 
         col.Bound(p => p.DateOn).Format("{0:u}").Title("Date"); 
         col.Bound(p => p.Priority).Width(50); 
         col.Bound(p => p.ExtendedProperty2).Width(100).Title("Action"); 
         col.Bound(p => p.AlarmTag).Title("Name"); 
         col.Bound(p => p.AlarmComment).Title("Comment"); 
         col.Bound(p => p.ExtendedProperty1).Title("AlarmID"); 
         col.Bound(x => x.DateOff).Title("Value"); 
        }) 
        .HtmlAttributes(new {style = "height:430px;"}) 

       ) 

Вот мои действия контроллера:

[HttpGet] 
public ActionResult Alarms_Read([DataSourceRequest] DataSourceRequest request, int id, DateTime? startDate, DateTime? endDateFilter) 
{ 
    var unit = UnitClient.GetUnit(id); 

    var fromDate = startDate ?? DateTime.Today.AddDays(-20); 
    var toDate = endDateFilter ?? DateTime.Now; 
    Model = new AlarmsViewModel 
    { 
     ViewUnitContract = UnitClient.GetUnit(id), 
     Alarms = AlarmClient.GetAlarmsForUnit(unit.Name, fromDate, toDate) 
      .Where(x => x.DateOff == null || x.DateAck == null) 
      .ToArray(), 
     UnitName = unit.Name, 
     Unit = new UnitDetailsModel(unit), 
     FromTime = fromDate, 
     ToTime = toDate 
    }; 

    return Json(Model.Alarms.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); 
} 

будем надеяться, что это будет помочь кому-то еще :)

-2

Вы также может рассмотреть использование библиотеки javascript Datajs (http://datajs.codeplex.com/), чтобы вычислить одату

+0

Зачем мне это делать и сложнее, когда Kendo уже поддерживает его из коробки? –

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