【发布时间】:2014-08-12 13:47:05
【问题描述】:
我有一个 ASP.NET Razor 页面,我在其中尝试使用 jQuery ajax 请求显示日志列表。根据我在文档和论坛中的理解,我提出了这个 ajax 请求:
$.ajax({
url: '@Url.Action("GetLogs","Logs")',
dataType: "json",
contentType :"application/json; charset=utf-8",
success: function (data) {
console.log("success");
console.log(data);
},
error: function (msg) {
console.log("error");
console.log(msg);
}
});
所以这行得通,但它返回的 json 并不是我想要的。以下是 ajax 请求(和 getAllLogs 函数)调用的控制器代码:
- LogsController -
public JsonResult GetLogs()
{
List<Log> _loglist = LogsModel.getAllLogs(UserModel.getUser(Session["FirstName"].ToString(), Session["LastName"].ToString()));
String json = JsonConvert.SerializeObject(_loglist, Formatting.Indented, new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
return Json(json, JsonRequestBehavior.AllowGet);
}
- LogsModel -
//get all logs to display in admin tab
public static List<Log> getAllLogs(User _user)
{
// if user is admin we can show logs concerning all users
if(UserModel.isAdmin(_user))
return db.Logs.Where(log => log.Action.Equals("Set Characteristic")).OrderByDescending(log => log.Id).ToList();
else
//user is manager and will see only users in same plant
return db.Logs.Where(log => log.User.Plant.Code.Equals(_user.Plant.Code) && log.Action.Equals("Set Characteristic")).OrderByDescending(log => log.Id).ToList();
}
当我遇到自引用循环问题时,我使用了我发现的(referenceloophandling)。我不再有它的问题,但正如我之前所说,返回的字符串不是我想要的。
getAllLogs() 函数根据用户权限返回日志。这里它只返回 1 个 Log 对象(用于测试目的),并且这个唯一的日志应该在 json 中序列化,格式如下:
[
{
"Id" : 1,
"User_Id": 1,
"Date": "2014-08-11T10:00:00.000",
"Action": "Set Characteristic",
"State": true,
"Message" : "User changed characteristic [charac_name]"
}
]
问题是我首先设计了数据库,用户对象与日志一起返回,所以这是返回的 Json:
[
{
"User": {
"Characteristic_Value": [],
"Logs": [
{
"Id": 1,
"User_Id": 1,
"Date": "2014-08-11T14:11:52.523",
"Action": "Login attempt",
"State": true,
"Message": "User successfully logged in"
},
{
"Id": 2,
"User_Id": 1,
"Date": "2014-08-11T14:13:45.07",
"Action": "Login attempt",
"State": true,
"Message": "User successfully logged in"
},
{
"Id": 3,
"User_Id": 1,
"Date": "2014-08-11T14:15:07.043",
"Action": "Login attempt",
"State": true,
"Message": "User successfully logged in"
},
Other User Data ...
},
"Id" : 21,
"User_Id": 1,
"Date": "2014-08-11T10:00:00.000",
"Action": "Set Characteristic",
"State": true,
"Message" : "User changed characteristic [charac_name]"
}
]
我得到了所有的用户数据。我是唯一一个在这个项目上工作的人,所以现在获取数据并不需要很长时间,但在不久的将来,会有更多的用户,查询的数据量将永远不会停止增加,而且我'我非常关心响应时间。
所以最后我的问题是:是否有可能摆脱与日志一起返回的用户数据?
我仍然对 JsonSerializerSettings 感到困惑,但也许这是解决这个问题的方法?
【问题讨论】:
-
你为什么不在你的 linq 中
Select日志? -
我不确定你的意思。但我认为这就是我在 getAllLogs 函数中所做的。事情与实体框架有关,因为我在日志中有一个指向用户表的外键,对于我得到的每个日志,我都会得到所有用户信息。不知道我能不能解释清楚...
标签: c# ajax asp.net-mvc entity-framework json.net