MVC主表和子表同时保存数据到数据库的方法(2.0版本)

10 篇文章 0 订阅
8 篇文章 0 订阅

经过三个版本的测试终于找到一个目前方便并且效率有所提升的一个方案

 public class FA_AssetUse
    {
        public FA_AssetUse()
        {
            FA_AssetUseDtls = new List<FA_AssetUseDtl>();
        }

       
        [Column(TypeName = "varchar")]
        [Key]
        public string InAssetUseID { get; set; }

 
        [Column(TypeName = "varchar")]
        public string AssetUseID { get; set; }


        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]
        public DateTime? UseDate { get; set; }

       [Column(TypeName = "varchar")]
        public string InCompanyID { get; set; }


        [Column(TypeName = "varchar")]
        public string InDeptID { get; set; }

  
        [Column(TypeName = "varchar")]

        public string InUserID { get; set; }


        
        [Column(TypeName = "varchar")]
        public string DoBillUser { get; set; }


        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]
        public Nullable<System.DateTime> DoBillDate { get; set; }


        [Column(TypeName = "int")]
        public int RatifyState { get; set; }


        [Column(TypeName = "nvarchar")]
        public string Remark { get; set; }


        [Column(TypeName = "bit")]
        public bool? Dr { get; set; }

  
        [Column(TypeName = "varchar")]
        public string ModifyUser { get; set; }


        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]

        public Nullable<DateTime> ModifyTime { get; set; }


        [Column(TypeName = "varchar")]
        public string RatifyUser { get; set; }

        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]

        public Nullable<DateTime> RatifyDate { get; set; }

        public IList<FA_AssetUseDtl> FA_AssetUseDtls { get; set; }
    }

    public class FA_AssetUseDtl
    {

        [Column(TypeName = "varchar")]
        [Key]
        public string SysNo { get; set; }


        [Column(TypeName = "varchar")]
        public string InAssetUseID { get; set; }


        [Column(TypeName = "nvarchar")]
        public string AssetBarCode { get; set; }


        [Column(TypeName = "bit")]
        public bool?  NeedReturn { get; set; }


        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]
        public Nullable<System.DateTime> PlanReturnDate { get; set; }


        [Column(TypeName = "datetime")]
        [DataType(DataType.DateTime)]
        public Nullable<System.DateTime> DoReturnDate { get; set; }


        [Column(TypeName = "nvarchar")]
        public string Remark { get; set; }


        [Column(TypeName = "bit")]
        public bool? Dr { get; set; }
       
    }

 

一、后台代码

1.在控制器中申明一个全局的实例类(FA_AssetUse)模型

private static FA_AssetUse editModel = null;

2.在控制器中Edit的方法

        public ActionResult Edit(string id)
        {
            try
            {
                EditInit();
                string action = "";
                // id="0" 代表是新
                if (id == "0")
                {
                    ViewBag.Title = "新增";
                    TempData["Action"] = "NEW";//将接收到的"动作参数"暂存在临时对象ViewBag.Action属性,默认为新增NEW
                    editModel = db.NewFA_AssetUse();
                    editModel = db.NewFA_AssetUseDtl(editModel);
                    //返回视图:Edit是窗体
                    return View("Edit", editModel);
                }
                else
                {
                    if (id == null)
                    {
                        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                    }

                    if (Request["action"] == null) //如果Request["action"]为空的时候就是修改状态,也就是点击保存之后只传第一个ID值,并未传action值,如何正常从index界面过来走不等于空
                    {
                        //id !="0" 代表是修改或查询
                        action = "modify";       //接收调用传过来的"动作参数"
                    }
                    else
                    {
                        //id !="0" 代表是修改或查询
                        action = Request["action"].ToString();           //接收调用传过来的"动作参数"
                    }
                    TempData["Action"] = action.ToUpper();                  //将接收到的"动作参数"暂存在临时对象ViewBag.Action属性
                    ViewBag.ShowSave = action.Equals("view") ? "NoShow" : "Show";  //编辑窗体是否显示保存按钮
                   editModel = db.FA_AssetUse.Find(id);
                    List<FA_AssetUseDtl> FA_AssetUseDtls = db.FA_AssetUseDtl.Where(p => p.InAssetUseID == id && p.Dr.Value != true).ToList<FA_AssetUseDtl>();
                    editModel.FA_AssetUseDtls = FA_AssetUseDtls;
                    //追加一行空行
                    editModel = db.NewFA_AssetUseDtl(editModel);

                    ViewBag.InObjectID = editModel.InAssetUseID;
                    ViewBag.Ratify = Convert.ToString(editModel.RatifyState);
                    //返回视图:Edit是窗体
                    return View("Edit", editModel);
                }

            }
            catch (Exception)
            {
                //空返回
                return new EmptyResult();
            }

        }

3.在控制器的保存方法中

  public ActionResult Save(FA_AssetUse fA_AssetUse, string action, string operation)
        {
            try
            {
                Init();

                //删除空行
                int length = fA_AssetUse.FA_AssetUseDtls.Count;
                fA_AssetUse.FA_AssetUseDtls.RemoveAt(QConvert.ToInt32(length-1));

                switch (action)
                {
                    //新增保存
                    case "保存":
                        //检验界面传回的模型数据对象是否有效
                        if (ModelState.IsValid)
                        {
                            if (operation == "NEW")
                            {
                                db.FA_AssetUse.Add(fA_AssetUse);
                                foreach (FA_AssetUseDtl item in fA_AssetUse.FA_AssetUseDtls)
                                {
                                        db.FA_AssetUseDtl.Add(item);
                                }
                                db.SaveChanges();
                            }
                            else if (operation == "MODIFY")
                            {
                                db.Entry(fA_AssetUse).State = EntityState.Modified;
                                //保存子表
                                foreach (FA_AssetUseDtl item in fA_AssetUse.FA_AssetUseDtls)
                                {
                                        var a = db.FA_AssetUseDtl.Where(p => p.SysNo == item.SysNo).FirstOrDefault();
                                        if (a == null)
                                        {
                                            db.FA_AssetUseDtl.Add(item);
                                        }
                                        else
                                        {
                                            db.Entry(item).State = EntityState.Modified;
                                        }
                                 
                                }
                                db.SaveChanges();
                            }

                            InBillIDValue = fA_AssetUse.InAssetUseID;
                            //跳转到编辑窗体
                            return RedirectToAction("Edit", new { id = fA_AssetUse.InAssetUseID });
                        }

                        //如果检验模型数据无效返回当前模型
                        return View("Edit", fA_AssetUse);

                    //取消
                    case "取消":
                        return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                WebCJFZ.DAL.Sys_ExceptionContext.InsertSys_Exception(
                    "FA_AssetUse", ex.Message, ex.StackTrace, fA_AssetUse.AssetUseID);
                throw new Exception(ex.Message);
            }
            //空返回
            return new EmptyResult();
        }

 

 

    #region 选择物料进行添加物料
        [HttpPost]
        public ActionResult InsertOrUpdatetFA_AssetUse(string[] jsonstr)
        {
            try
            {
                //初始化
                EditInit();
                //转换成字符串
                String JsonStr = QConvert.ToString(jsonstr[0]);
                //将字符串转换成datatable
                DataTable dataTable = QConvert.JsonToDataTable(QConvert.ToString(JsonStr));
             
                //添加明细数据集合
                editModel = db.InsertorUpdateFA_AssetUseDtl(editModel, dataTable);
                //要绝对路径.datastest1--要传到分部视图中的数据.
                return PartialView("/Views/FA_AssetUse/EditPatialView.cshtml", editModel);
            }
            catch (Exception exp)
            {
                throw exp;
            }
        }
        #endregion

4.在上下文对象中添加实体类的创建对象

  #region 新建模型主体对象
        /// <summary>
        /// 新建模型对象
        /// </summary>
        /// <returns></returns>
        public Model.FA_AssetUse NewFA_AssetUse()
        {
            Model.FA_AssetUse FA_AssetUse = new Model.FA_AssetUse();
            FA_AssetUse.InAssetUseID = (new IDCreator()).GetIdentity();
            FA_AssetUse.AssetUseID = Sys_BillIDRuleContext.GetBillIDValue("FA_AssetUse");
            FA_AssetUse.UseDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            FA_AssetUse.RatifyState = 1;
            FA_AssetUse.InCompanyID = HttpCookiesHelper.GetUserInfo("InCompanyID");
            FA_AssetUse.InUserID = HttpCookiesHelper.GetUserInfo("InUserID");
            FA_AssetUse.InDeptID = HttpCookiesHelper.GetUserInfo("InDeptID");
            FA_AssetUse.DoBillUser = HttpCookiesHelper.GetUserInfo("InUserID");
            FA_AssetUse.DoBillDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            FA_AssetUse.Dr = false;
            return FA_AssetUse;
        }
        #endregion

        #region 新建模型对象(明细对象)
        /// <summary>
        /// 新建模型对象
        /// </summary>
        /// <returns></returns>
        public Model.FA_AssetUse NewFA_AssetUseDtl(FA_AssetUse Edin)
        {
            Model.FA_AssetUseDtl FA_AssetUsedtl = new Model.FA_AssetUseDtl();
            FA_AssetUsedtl.SysNo = (new IDCreator()).GetIdentity();
            FA_AssetUsedtl.InAssetUseID = Edin.InAssetUseID;
            FA_AssetUsedtl.AssetBarCode = "";
            FA_AssetUsedtl.NeedReturn = false;
            FA_AssetUsedtl.Remark = "";
            FA_AssetUsedtl.Dr = false;
            Edin.FA_AssetUseDtls.Add(FA_AssetUsedtl);
            return Edin;
        }

        #endregion

#region 新增或者修改方法
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Model.FA_AssetUse DataTableToFA_AssetUseDtl(FA_AssetUse Edit, DataTable tableDate)
        {
            //清除集合中所有数据
            Edit.FA_AssetUseDtls.Clear();

         ModelConvertHelper<>.ConvertToModel  //此方法是将datatable数据源转换成实例对象集合         https://blog.csdn.net/weixin_42206447/article/details/89599521
            IList<FA_AssetUseDtl> FA_AssetUseDtls = ModelConvertHelper<FA_AssetUseDtl>.ConvertToModel(tableDate);
            foreach (FA_AssetUseDtl item in FA_AssetUseDtls)
            {
                Edit.FA_AssetUseDtls.Add(item);
            }
            return Edit;
        }
        #endregion

 #region 新增或者修改方法
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public Model.FA_AssetUse InsertorUpdateFA_AssetUseDtl(FA_AssetUse Edit, DataTable tableDate)
        {
            //清除集合中所有数据
            Edit.FA_AssetUseDtls.Clear();

           ModelConvertHelper<>.ConvertToModel  //此方法是将datatable数据源转换成实例对象集合https://blog.csdn.net/weixin_42206447/article/details/89599521
            IList<FA_AssetUseDtl> FA_AssetUseDtls = ModelConvertHelper<FA_AssetUseDtl>.ConvertToModel(tableDate);
            foreach (FA_AssetUseDtl item in FA_AssetUseDtls)
            {
                Edit.FA_AssetUseDtls.Add(item);
            }

            //添加空行
            Edit = NewFA_AssetUseDtl(Edit);

            return Edit;
        }
        #endregion

 

二、前台代码

PartialView("/Views/FA_AssetUse/EditPatialView.cshtml", editModel); //EditPatialView局部视图页面,这个就是展示table表格的局部视图

1.将前台table中的数据转换成json字符串

function ReturnArray() {
    debugger;
    var trs = $("#TableAdd tr:not(:first)");
    //声明一个盒子
    var array = [];
    //循环你所要选择的行
    $.each(trs, function (i, val) {
        if ($("#Delete_" + i + "").length > 0) {
            var tr = val;
            var json = { SysNo: "", InAssetUseID: "", AssetBarCode: "", NeedReturn: "", PlanReturnDate: "", DoReturnDate: "", Remark: "",}
            json.AssetBarCode = document.getElementById("AssetBarCode_" + i + "").value;
            json.SysNo = document.getElementById("SysNo_" + i + "").value;
            json.InAssetUseID = document.getElementById("InAssetUseID_" + i + "").value; 
            json.NeedReturn = document.getElementById("NeedReturn_" + i + "").value; 
            json.PlanReturnDate = document.getElementById("PlanReturnDate_" + i + "").value; 
            json.DoReturnDate = document.getElementById("DoReturnDate_" + i + "").value; 
            json.Remark = document.getElementById("Remark_" + i + "").value;
            //全加入
            array.push(json);
        }
    });
    return array;
}

2.执行提交方法进行提交

       //执行后台方法
        var model = [];
        var json = JSON.stringify(ReturnArray('@ViewBag.FunctionID'));
        model.push(json); //单个参数

       //model.push(json,参数1,参数2,参数3,参数4,......);多个参数向后台进行传递
        $.ajax({
            url: '/FA_AssetUse/InsertOrUpdatetFA_AssetUse',//控制器活动,返回一个分部视图,并且给分部视图传递数据.
            type: 'POST',
            data:  JSON.stringify(model),   //这个参数一定要传这个类型后台接收是否 string [] strjson,参数都在这个string
            contentType: 'application/json;charset=utf-8',//数据类型必须有
            async: true,//异步
            cache: false,
            success: function (data) //成功后的回调方法
            {
                $("#BodyPanel").html(data);//data--就是对应的分部视图页面内容
            },
            error: function (data) {
                alert("失败:" + data[0])//弹出框
            }

        });

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值