2016-02-09 47 views
-1

我使用JQuery数据表向我的应用程序的用户显示数据。我的数据来自使用Ajax的服务器。这是我在做什么请求的资源上没有“Access-Control-Allow-Origin”标头。 Jquery Datatables

$('#order-table').dataTable({ 
    "ajax": { 
     "url": TippNett.Api.Url + "Order/DataTable", 
     "data": function (d) { 
      d.token = authToken; 
     } 
    }, 
    "processing": true, 
    "serverSide": true, 
    "columns": [ 
     { "data": "OrderType", render: getOrderTypeImg }, 
     { "data": "Location" }, 
     { "data": "MassType" }, 
     { "data": "Amount" }, 
     { "data": "RemainingAmount" }, 
     { "data": "CreatedDate" }, 
     { "data": "StartDate" }, 
     { "data": "EndDate" }, 
     { "data": "Org" } 
    ] 
}); 

看起来很好,一切正常。但问题是,当我试图寻找我有两种情况下,它无法

  • 如果我复制到被搜索的项目,并将其粘贴在搜索框中我没有得到任何结果,并在控制台中我得到的以下错误

的XMLHttpRequest无法加载http://api.tippnett.com/Order/DataTable?draw=18&columns%5B0%5D%5Bdata%5D=Or ... yggv &搜索%5Bregex%5D =假&令牌= 8587465804588061807sn6n & _ = 1455024583582。请求的资源上没有“Access-Control-Allow-Origin”标题。因此,'http://www.tippnett.com'不允许访问。响应有HTTP状态代码404

  • 第二种情况是更怪异。因此,让我说我的桌子有不同位置的位置。其中之一是挪威。当我输入Norw时,它显示了结果,但如果我继续打字,它会给我提供同样的上述错误。

我的服务器代码是这样的

[HttpGet] 
[AllowCrossSiteJson] 
[AdminAttribute] 
public dynamic DataTable([System.Web.Http.ModelBinding.ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestModel) 
    { 
     int totalRecords = Order.GetAll().Count(); 

     IEnumerable<Order> list; 
     if (requestModel.Search.Value != null && requestModel.Search.Value != "") 
     { 
      String searchValue = requestModel.Search.Value.ToLower(); 
      list = (from a in Order.GetAll().OrderByDescending(i => i.To) 
        where 
        a.Amount.ToString().ToLower().Contains(searchValue) || 
        (a.Amount - a.MatchedAmount).ToString().ToLower().Contains(searchValue) || 
        a.GetOrganization().Name.ToLower().Contains(searchValue) || 
        a.GetLocation().FriendlyName.ToLower().Contains(searchValue) || 
        a.GetMassType().Name.ToLower().Contains(searchValue) || 
        a.From.ToShortDateString().ToLower().Contains(searchValue) || 
        a.GetCreatedDate().ToShortDateString().ToLower().Contains(searchValue) || 
        a.To.ToShortDateString().ToLower().Contains(searchValue) 
        select a); 
     } 
     else 
      list = Order.GetAll().OrderByDescending(i => i.To); 


     int filteredRecords = list.Count(); 

     DataTables.Mvc.Column orderColumn = requestModel.Columns.GetSortedColumns().FirstOrDefault(); 

     if (orderColumn != null) 
     { 
      Func<Order, String> keySelector; 

      switch (orderColumn.Data) 
      { 
       default: 
       case "MassType": 
        keySelector = r => r.GetMassType().Name; 
        break; 
       case "Location": 
        keySelector = r => r.GetLocation().FriendlyName; 
        break; 
       case "Org": 
        keySelector = r => r.GetOrganization().Name; 
        break; 
       case "StartDate": 
        keySelector = r => r.From.ToShortDateString(); 
        break; 
       case "EndDate": 
        keySelector = r => r.To.ToShortDateString(); 
        break; 
       case "CreatedDate": 
        keySelector = r => r.GetCreatedDate().ToShortDateString(); 
        break; 
       case "Amount": 
        keySelector = r => r.Amount.ToString(); 
        break; 
       case "RemainingAmount": 
        keySelector = r => (r.Amount - r.MatchedAmount).ToString(); 
        break; 
      } 

      if (orderColumn.SortDirection == Column.OrderDirection.Ascendant) 
       list = list.OrderBy(keySelector); 
      else 
       list = list.OrderByDescending(keySelector); 
     } 

     list = list.Skip(requestModel.Start).Take(requestModel.Length).ToList(); 

     List<dynamic> data = new List<dynamic>(); 
     foreach (Order order in list) 
     { 
      Location loc = order.GetLocation(); 
      Organization org = order.GetOrganization(); 


      data.Add(new 
      { 
       DT_RowId = order.Id, 
       Location = loc.FriendlyName, 
       MassType = order.GetMassType().Name, 
       Amount = order.Amount, 
       RemainingAmount = order.Amount - order.MatchedAmount, 
       CreatedDate = order.GetCreatedDate().ToShortDateString(), 
       StartDate = order.From.ToShortDateString(), 
       EndDate = order.To.ToShortDateString(), 
       Org = org.Name, 
       OrderType = order.OrderType.ToString() 

      }); 
     } 

     return new 
     { 
      draw = requestModel.Draw, 
      recordsTotal = totalRecords, 
      recordsFiltered = filteredRecords, 
      data = data 
     }; 
    } 

这里是我如何处理CORS

公共类AllowCrossSiteJsonAttribute:ActionFilterAttribute {

public override bool Match(object obj) 
    { 
     return base.Match(obj); 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     if (actionExecutedContext.Response != null) 
     { 
      if (actionExecutedContext.Request.Method.Method == "OPTIONS") 
      { 
       actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 
       actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Headers", actionExecutedContext.Request.Headers.GetValues("Access-Control-Request-Headers")); 

       actionExecutedContext.Response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 

      } 
     } 

     base.OnActionExecuted(actionExecutedContext); 
    } 

} 
+0

您是否看到这个'[AllowCrossSiteJson]'我已经处理了CORS。这是给我的结果相同的api。我得到的问题是没有找到结果。然后我得到这个错误。 – mohsinali1317

+0

我没有,不,但它不是一个标准的ASP.Net的东西。很明显,它在某些情况下没有做好工作。所以这就是在哪里看,该属性的实现。 –

+0

我添加了定义供您查看。 – mohsinali1317

回答

0

我遇到的问题是因为我使用GET获取数据,所以我必须使用POST,因为有限制我们得到GET请求。

相关问题