日期:2014-05-17  浏览次数:20596 次

MVC,实体保存问题
实体Index,属性有ID,Content,CreateDate

实体Detail,属性有ID,IndexID,CargoName

其中,实体Detail中的IndexID是外键。Detail和Index是多对一关系。

问题,我先描述一下。
若只需要保存Index的数据,那么视图上放3个对应的控件,名称与字段名一致,保存时序列化成ID=1&Content=2&CreateDate=2012-08-15,传入控制器中。
而控制器中的保存方法,参数是Index实体的实例。会将序列化数据转换成Index实体,而后只需要新增该实体即可。
如:
JScript code
function saveIndex() {
        if ($('#fm').valid()) {
            $.post(url, $("#fm").serialize() + '&' + $("#fm").serializeDisabled(), function (result) {
                if (result.success) {
                    $.messager.alert('提示', '数据已保存!');
                    javascript: $('#dlg').dialog('close')
                    $('#dg').datagrid('reload'); // 刷新数据
                } else {
                    $.messager.alert('提示', '数据保存出现错误!', 'error');
                }
            }, 'json');
        }
    }


C# code
/// <summary>
        /// 新建-保存
        /// </summary>
        /// <param name="company"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Create(Index index)
        {
            try
            {
                IndexRepository.Insert(index);
                return Json(new { success = true });
            }
            catch (Exception e)
            {
                return Json(new { msg = "服务出现错误." });
            }
        }


但是现在,视图中的控件,不仅仅是Index实体的,也有Detail实体的(就是那个CargoName)。
我希望控制器中的保存方法中的参数是Index index,List<Detail> detail,然后先新增index,返回新增后的主键ID,再循环赋值给detail中的IndexID字段,最后新增detail。

关键问题,js中还是把控件序列化,再传入控制器吗?
如果是这样,那控制器中该怎么写?如果不是,请问js和控制分别该怎么写?

以及怎么获得“刚新增”的记录的主键ID?

分不多,只有40分,希望能有人帮助我解开这个疑惑。先谢谢了。

------解决方案--------------------
你可以搞一个综合性的实体来接受,单独定义一个,根据你的需要

当你
db.BIF.AddObject(model);
db.SaveChanges();
之后,该model已经更新

此时model.ID就是刚刚插入的ID
------解决方案--------------------
单独的model,如果是EF的话,完全可以用映射来的表模型,不必创建

如果有特殊需要,那么可以考虑创建一个符合需求的Model,你比如说,有张表,字段太多,那么我的需求是更新其中 的某几个字段,那么可以搞一个小型的Model,保证页面在提交请求时的模型最小话

当然,如果一个页面涉及到多个实体模型,那么可以采用综合性model的方式,也可以分成不同的表单,然后分别提交,互不影响,都是以个人需求而定