我使用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);
}
}
您是否看到这个'[AllowCrossSiteJson]'我已经处理了CORS。这是给我的结果相同的api。我得到的问题是没有找到结果。然后我得到这个错误。 – mohsinali1317
我没有,不,但它不是一个标准的ASP.Net的东西。很明显,它在某些情况下没有做好工作。所以这就是在哪里看,该属性的实现。 –
我添加了定义供您查看。 – mohsinali1317