我有一个Action表,里面有外键,然后我想将着整个表序列化成Json格式的数据,然后传给前台的easyui的datagrid,但是总是没有数据,然后我干脆用ajax去请求这个AllAction()动作方法,惊讶的发现它居然执行结果状态是error,进入了error的回调函数中,也就是说Json方法转化不成功,上网搜了下,应该是我这个T_Action表有外键,调用Json去序列化它就会失败,谁遇到过这种情况,你们怎么解决的??
动作方法AllAction:
[HttpPost] public JsonResult AllAction() { return Json(_responsitory.Actions); }
Actions属性对应的实体是T_Action
public partial class T_Action { public T_Action() { this.T_ActionGroup = new HashSet<T_ActionGroup>(); } public int Action_ID { get; set; } public string Action_Name { get; set; } public int Action_ColumnID { get; set; } public string Action { get; set; } public string ViewMode { get; set; } public string ActionUrl { get; set; } public virtual T_ActionColumn T_ActionColumn { get; set; } public virtual ICollection<T_ActionGroup> T_ActionGroup { get; set; } }
前台ajax
$.ajax({ url: '@Url.Action("AllAction")', dataType:"json", method: "post", success: function (data) { alert(data); $.each(data, function (k, v) { alert(v.Action_Name); }); }, error: function (e,a) { alert(a); } })
页面弹出框显示 error
困惑很久了
太粗心了,ajax的提交方式居然用的是method,其实应该是type,我擦,已经解决了,并不是外键问题
也没细看你的ajax的脚本。
楼主 ,真的是这个答案么
1、_responsitory.Actions有内容否?
2、注释另外两个virtual的对象是否能解决?
3、Repository里的东西最好不要直接用于UI,而应该使用Model做中间层,使用中间Model后是否问题还依旧?
有的,我按照下面那样去写
[HttpPost] public JsonResult AllAction() { T_Action[] s = _responsitory.Actions.ToArray<T_Action>(); return Json(_responsitory.Actions); }
s数据有27个元素,每个元素的内容刚好就是一个T_Action对象,但是一旦调用Json去序列化成为json数据,然后就会异常也就是我的ajax方法进入error回调function,另外两个virtual我刚开始是这样写的
_responsitory.Actions.Select(m => new T_Action{ Action_Name= m.Action_Name, Action_ColumnID = m.Action_ColumnID...})。
然后再对这个结果进行调用json,但是不知道是不是不能这样写,一样的没有达到效果,虽然避开了两个virtual导航属性,也就是外键,
对于你说的Respository里面的东西不能直接作用于UI我不是很理解,可以说一下吗,我的Respository是是这样的
public class EFAccessRespository:IAccessResponsitory { private AccessEntities db = new AccessEntities(); public IQueryable<T_Action> Actions { get { return db.T_Action; } } public IQueryable<T_ActionColumn> ActionColumns { get { return db.T_ActionColumn; } } public IQueryable<T_ActionGroup> ActionGroups { get { return db.T_ActionGroup; } } public IQueryable<T_Group> Groups { get { return db.T_Group; } } public IQueryable<T_User> Users { get { return db.T_User; } } public IQueryable<T_UserGroup> UserGroups { get { return db.T_UserGroup; } } public List<GetAccessTreeTopNode_Result> GetAccessInfo(string userNo) { return db.GetAccessTreeTopNode(userNo).ToList<GetAccessTreeTopNode_Result>(); } public List<GetAccessTreeChildNode_Result> GetAccessChildInfo(string userNo, string topName) { return db.GetAccessTreeChildNode(userNo, topName).ToList<GetAccessTreeChildNode_Result>(); } public int Access_Delete_Action(string name) { return db.Access_Delete_Action(name); } public int Access_InsertAction(string name, Nullable<int> coId, string desc, string url) { return db.Access_InsertAction(name, coId, desc, url); } }
设计的不知道是否合理,也是刚做MVC,请指导下
@车上有首长: 敢情你的Actions是一个IEnumerable的泛型集合啊。
把这个ToArray应该就好了。
@519740105: ToArray,ToList都是不行的,我试过了,现在其实我用的是创建一个视图模型ViewModel,也就是你所说的用Model坐中间层,将_respository查出来的数据用视图模型封装下,在传递到前台
public JsonResult AllAction(string rows,string page) { int iPage = int.Parse((page == null || page == "0") ? "1" : page); int iRow = int.Parse((rows == null || rows == "0") ? "10" : rows); int total = _responsitory.Actions.Count(); var a = from action in _responsitory.Actions.OrderBy(m => m.Action_ID).Skip((iPage - 1) * iRow).Take(iRow) select new ActionData { Action_Name = action.Action_Name, Action_ColumnID = action.Action_ColumnID, Action = action.Action, ActionUrl = action.ActionUrl }; PageResultData<ActionData> b = new PageResultData<ActionData> { total = total, rows = a }; return Json(b); }
其实ajax方法用method应该也可以的,主要是如果我想获取复杂类型的实体,那么Json方法是没法去处理的
@车上有首长: 我觉得你应该确认:
1、你的ajax是否进入了这个Action
2、你的数据是否真的成功获取了
3、结果的数据对象是否能转换为JSON字符串(可以使用json方法单独调用)
4、action的返回,非特别,不建议写JsonResult之类的,直接ActionResult就足够了。
有个比较笨的方法就是新建一个新的类和原来要转换的类差不多,唯一的差别就是去掉了外键的属性(就是virtual的那些),然后再原来的类加个方法,就是逐个属性的将原来的类赋值到新的类的变量中,最后返回新的类的变量,然后将这个变量序列化
把js中的dataType:"json",这个参数去掉试试~