表单提交时,更新的操作

//原程序的写法,意思就是,先查出数据库里面的记录,然后用提交过来的数据进行覆盖数据库里面的值,调用的方法是SetAttribute

public IActionResult UpdateSaleAfterDTID(int id, string proname, string isupdate, IFormCollection values, int orderid)
        {
            if (!string.IsNullOrEmpty(isupdate))
            {
                //表单提交时触发事件
                var fchelpAdd = new FormConfigHelp(db, Url);
                var AllConfigs = fchelpAdd.GetBodies(RouteData, "MainForm1");
                var cvalue = values.Where(p => AllConfigs.Where(q => q.ClassName == "Model.SFSaleAfterDT").Select(q => q.ControlID).Contains(p.Key)).ToList();

                var SFSaleAfterDTID = Convert.ToInt32(values["SaleAfterDTID"]);
                var sfdt = db.SFSaleAfterDT.Where(p => p.SaleAfterDTID == SFSaleAfterDTID).FirstOrDefault();
                fchelpAdd.SetAttribute(sfdt, cvalue);

                db.SaveChanges();
                PageContext.RegisterStartupScript(ActiveWindow.GetHideRefreshReference());
                return UIHelper.Result();

            }
}
public void SetAttribute(object model, List<KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>> values)
        {
            var entityEntry = db.Entry(model);
            foreach (var item in values)
            {
                var DateValue = entityEntry.Property(item.Key);
                if (item.Value.ToString() == "")
                {
                    DateValue.CurrentValue = null;
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("String"))
                {
                    DateValue.CurrentValue = item.Value.ToString();
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("Decimal"))
                {
                    DateValue.CurrentValue = Convert.ToDecimal(item.Value);
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("Int32"))
                {
                    int value;
                    if (item.Value.ToString().ToLower() == "false")
                    {
                        value = 0;
                    }
                    else if (item.Value.ToString().ToLower() == "true")
                    { value = 1; }
                    else { value = Convert.ToInt32(item.Value); }
                    DateValue.CurrentValue = value;
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("Int64"))
                {
                    long value;
                    if (item.Value.ToString().ToLower() == "false")
                    {
                        value = 0;
                    }
                    else if (item.Value.ToString().ToLower() == "true")
                    { value = 1; }
                    else { value = Convert.ToInt64(item.Value); }
                    DateValue.CurrentValue = value;
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("DateTime"))
                {
                    DateValue.CurrentValue = Convert.ToDateTime(item.Value);
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("Boolean"))
                {
                    DateValue.CurrentValue = Convert.ToBoolean(item.Value);
                }
                else if (DateValue.Metadata.ClrType.ToString().Contains("Double"))
                {
                    DateValue.CurrentValue = Convert.ToDouble(item.Value);
                }
                else
                {
                    string a = DateValue.Metadata.ClrType.ToString();
                }
            }
        }

下面是我的写法,直接把提交过来的数据创建成一个类,然后查数据库里面的数据,进行对比,如果数据库里的字段有值,创建的类的字段没有值,那么就把数据库里的值覆盖到创建的类的字段里,然后用创建的类去更新数据库,用的方法是JyfUpdateModel.updateModel

public IActionResult btnUpdateSFAccessoryGrid_Click(IFormCollection values, SFAccessory sfacc, string orderid, string isupdate, string rowIndex, string U9ID,int fnrid)
{

     var dbAcModel = db.SFAccessory.Find(sfacc.AccessoryID);
     db.Entry(dbAcModel).State = EntityState.Detached;//不跟踪数据库里查出来的类
    JyfUpdateModel.updateModel(dbAcModel,sfacc);
     db.Update(sfacc);
     db.SaveChanges();
}

/// <summary>                         
    ///创建人:咖啡无眠
    ///日 期:2019/12/23
    ///描 述:更新实体,与数据库实体进行对比
    /// </summary>
    public class JyfUpdateModel
    {
        public static void updateModel(object dataBaseObj, object newObj)
        {
            Type t = dataBaseObj.GetType();
            //3.2.3?获取实体类所有的公共属性??
            List<PropertyInfo> propertyInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
            //3.2.4?创建实体属性字典集合??
            Dictionary<string, PropertyInfo> dicPropertys = new Dictionary<string, PropertyInfo>();
            //3.2.5?将实体属性中要修改的属性名?添加到字典集合中??键:属性名??值:属性对象??
            propertyInfos.ForEach(p =>
            {
                dicPropertys.Add(p.Name, p);
            });

            Type t2 = newObj.GetType();
            foreach (var item in t2.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList())
            {
                if (dicPropertys.Keys.Contains(item.Name))
                {
                    try
                    {
                        if (item.GetValue(newObj) == null && dicPropertys[item.Name].GetValue(dataBaseObj) != null)
                        {
                            item.SetValue(newObj, dicPropertys[item.Name].GetValue(dataBaseObj));
                        }

                    }
                    catch (Exception ex)
                    {
                        throw;
                    }
                }
            }
        }

    }

原文地址:https://www.cnblogs.com/jiangyunfeng/p/12106160.html

时间: 2024-08-29 06:32:29

表单提交时,更新的操作的相关文章

表单提交时如何将错误信息传递到页面中,并且保存原来提交数据

曾经何时,你还有我或许都在困惑,如何方便的将验证不通过的表单信息再返回到前台页面,例如我注册一个账号,辛辛苦苦填写了N多项,一个格式验证没有通过,一切都需要充填,虽然Ajax可以解决这个问题,但是我们总不能把所有表单提交都弄成ajax,更何况有若干人就是没事把javascript给禁止了.哎哎,好了解决方案来了,下面以用户登录为例,说说我的解决方案. 服务器端用nodejs实现: login.html 简单的提交表单 <form action="" id="loginF

表单提交时编码类型enctype详解

很早以前,当还没有前端这个概念的时候,我在写表单提交完全不去理会表单数据的编码,在action属性里写好目标URL,剩下的啊交给浏览器吧~但是现在,更多时候我们都采用Ajax方式提交数据,这种原始的方式仅仅被当成优雅降级的产物. 当我们用异步方式提交表单,就需要稍微关注一下表单数据的编码问题了.回想一下,在写回调函数时是不是有根据过请求的Content-Type写不同业务逻辑的经历,那这个Content-Type和表单的编码有什么联系吗?有没有在明明前端已经发数据给后端了,后端的小伙伴死活取不到

(转)html 表单提交时,无法获取到disabled属性的input值

input的字段当为disabled是,无法获取值,无法改变值,所以在表单提交时,获取不到值.可以用randomly解决这个问题. <input name="country" id="country" size=12 value="demo" disabled="disabled" > 但是将disabled = "disabled"换成randomly="randomly"

使用 HttpClient 进行表单提交时,遇到的问题

问题 在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据.在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求..NET 提供了 MultipartFormDataContent 类型,帮助我们构建表单请求,故有以下代码: var form = new MultipartFormDataContent() { {new StringContent("Value"),"Name}, {new ByteArrayCont

表单提交时submit按钮的值没有被提交

FORM表单中,submit提交的时候,有时候有值,有时候无值 FORM表单中,submit的name是Submit.如下<input type="submit" name="Submit" value="提交表单" /> 1.出现的几种情况 1.当点击submit按钮时,FORM被提交,提交后获取的数组中有Submit下标的值 2.回到FORM表单,直接敲回车提交,这时候发现获取的数组中没有Submit下标. 3.在浏览器版本低的情

表单提交时判断

<input type="submit" id="myBtn" />换成: <input type="button" id="myBtn" />用 $("#myBtn").click(function(){   ...//判断验证}); 表单提交js: function formSubmit(){ if(flag=="1"){ $("#form"

SHOWMODALDIALOG表单提交时禁止打开新窗口

前提条件:showmodaldialog中有表单form.当action="#"的时候,提交表单,不会打开新窗口,但这种#自提有时不能用,#是本页面完整的带参数的url,如果表单中有参数和url中的参数相同,那么提交后,表单中的这个同名参数会被#中的参数覆盖,造成表单中的这个参数无法取得,除非在表单中重新修改name这个参数: 当actiong="本页面.jsp"的时候,提交时,在IE环境中showmodaldialog会打开新的窗口,设置target="

JS之表单提交时编码类型enctype详解

简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded. 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url. 当act

【教训】 form表单提交时,action url中参数无效

今天提交一个表单,内容参考如下: <form action="add.php?a=123&b=456">     <input type="hidden" name='user_id' value="46" />     <input type="hidden" name='user_name' value="snsgou" />     ...     <