首页 新闻 赞助 找找看

MVC中用Json方法返回JsonResult失败,进来看下

0
悬赏园豆:5 [已解决问题] 解决于 2014-08-26 00:30

我有一个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

困惑很久了

LgV5的主页 LgV5 | 菜鸟二级 | 园豆:221
提问于:2014-08-25 17:57
< >
分享
最佳答案
0

太粗心了,ajax的提交方式居然用的是method,其实应该是type,我擦,已经解决了,并不是外键问题

LgV5 | 菜鸟二级 |园豆:221 | 2014-08-26 00:29

也没细看你的ajax的脚本。

519740105 | 园豆:5810 (大侠五级) | 2014-08-26 08:38

楼主 ,真的是这个答案么

快乐起航 | 园豆:61 (初学一级) | 2017-02-07 15:36
其他回答(3)
0

1、_responsitory.Actions有内容否?

2、注释另外两个virtual的对象是否能解决?

3、Repository里的东西最好不要直接用于UI,而应该使用Model做中间层,使用中间Model后是否问题还依旧?

收获园豆:5
519740105 | 园豆:5810 (大侠五级) | 2014-08-25 18:06

有的,我按照下面那样去写

        [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,请指导下

支持(0) 反对(0) LgV5 | 园豆:221 (菜鸟二级) | 2014-08-25 18:15

@车上有首长: 敢情你的Actions是一个IEnumerable的泛型集合啊。

把这个ToArray应该就好了。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 21:14

@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方法是没法去处理的

支持(0) 反对(0) LgV5 | 园豆:221 (菜鸟二级) | 2014-08-26 17:25

@车上有首长: 我觉得你应该确认:

1、你的ajax是否进入了这个Action

2、你的数据是否真的成功获取了

3、结果的数据对象是否能转换为JSON字符串(可以使用json方法单独调用)

4、action的返回,非特别,不建议写JsonResult之类的,直接ActionResult就足够了。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-26 17:30
0

有个比较笨的方法就是新建一个新的类和原来要转换的类差不多,唯一的差别就是去掉了外键的属性(就是virtual的那些),然后再原来的类加个方法,就是逐个属性的将原来的类赋值到新的类的变量中,最后返回新的类的变量,然后将这个变量序列化

Mushroom0417 | 园豆:327 (菜鸟二级) | 2014-08-25 20:29
0

把js中的dataType:"json",这个参数去掉试试~

幻天芒 | 园豆:37175 (高人七级) | 2014-08-25 21:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册