.NETコアMVCモデル充填フィルター

プログラム開発、我々は多くの場合、すべてのデータベーステーブルは、そのような人々の個人データの記録、作成時刻、変更時刻と修正を作成する必要が同じ属性や行動を、持って発生することがあります。これらに加えて、各アクション情報のすべて場合は、見てあまりエレガント、冗長コードの比較を見て、その前acitonを入力するためのモデルの要求を満たすにフィルタを追加することを検討してください。だから我々は、すべてのアクションに必要なことや時間のスタッフを作成するために、ログイン情報をしないことをビジネス上のプログラミングのプロセスをより集中させるために、クラスアクションのために再現することができます。同時に、我々はまた、ここでは、単一引用符で何らかのフィルタリングやキーワードフィルタリングを行うことができます。

ここで私は、メソッドをオーバーライドすることでOnActionExecutingモデルを埋め、ActionFilterAttributeを使用することにしました。次のように具体的なコードは次のとおりです。

 パブリック クラスModelFillFilter:ActionFilterAttribute 
    { 
        パブリック オーバーライド ボイドOnActionExecuting(ActionExecutingContextコンテキスト)
        { 
            塩基.OnActionExecuting(コンテキスト)。

            VARのパラメータ= context.ActionArguments。

            parameters.ForEach(パラメータ => 
            { 
                VARのモデル= parameter.Value;
                 場合(モデル== NULLのリターン;
                 VARのリスト= 新しいArrayListを(); 

                場合typeof演算(いるICollection).IsAssignableFrom(model.GetType()))
                { 
                    list.AddRange(モデルなどいるICollection)。
                } 
                
                { 
                    list.Add(モデル)。
                } 

                list.ToArray()のForEach(項目。 => 
                { 
                    VARの propertys = item.GetType()GetPropertiesの(); 
                    propertys.ForEach(P => 
                    { 
                        // 替换」解决SQL注入问题
                        場合(p.PropertyType.Name。 TOLOWERは()。(入って" 文字列")&& p.GetValue(アイテム)!= nullを!&& p.GetSetMethod()= NULL 
                        { 
                            p.SetValue(項目、p.GetValue(アイテム))(.ToString交換(" ' " " '' " ))。
                        } 
                    })。
                }); 
            }); 

            VAR tokenObj = context.HttpContext.Request.Form [ " トークン" ]; 

            もし(!文字列.IsNullOrEmpty(tokenObj))
            { 
                VARのトークン= tokenObj.ToString();
                VARuserInfoService = Ioc.GetService <IUserInfoService> ();
                VaRのユーザー= userInfoService.Get <UserInfoModel>(文字列 .Format(" LoginToken = '{0}' " )、トークン)。

                もし(!ユーザー= ヌル
                { 
                    parameters.ForEach(パラメータ => 
                    { 
                        VARのモデル= parameter.Value;
                         場合(モデル== nullのリターン; 

                        VARのリスト= 新しいArrayListを(); 

                        場合typeof演算(いるICollection).IsAssignableFrom(model.GetType()))
                        { 
                            list.AddRange(モデルなどいるICollection)。
                        } 
                        
                        { 
                            list.Add(モデル)。
                        } 

                        。list.ToArray()のForEach(項目 => 
                        { 
                            VARの propertys = 。item.GetType()GetPropertiesの();
                             // 模型处于创建状态
                            BOOL isCreateは= propertys.Any(P => p.Name.ToLower()= = " ID " &&
                                   (p.GetValue(アイテム) == NULL ||
                                     .IsNullOrEmpty(p.GetValue(アイテム).ToString())|| 
                                   p.GetValue(アイテム).ToString() == " 0 " ));
                            もし(isCreateは)
                            { 
                                propertys.ForEachた(p => 
                                { 
                                    // 字段填充
                                    場合(p.Name.ToLower()== " CREATEDBY " && p.GetSetMethod()!= nullを &&ユーザー!= nullを
                                        p.SetValue(項目、Convert.ToInt32(user.Id))。
                                    それ以外の 場合(p.Name.ToLower()== " createdat " && p.GetSetMethod()!= nullの
                                        p.SetValue(アイテム、DateTime.Now); 
                                }); 
                            } 

                            // 模型处于编辑状态
                            BOOL isUpdate = propertys.Any(P => p.Name.ToLower()== " ID " && 
                                    (p.GetValue(アイテム)!= NULL && ストリング.IsNullOrEmpty(p.GetValue(アイテム).ToString())&& 
                                    p.GetValue(アイテム).ToString()!= " 0 " ));
                            もし(isUpdate)
                            { 
                                propertys.ForEachた(p => 
                                { 
                                    // 字段填充
                                    場合(p.Name.ToLower()== " updatedby " && p.GetSetMethod()!= nullを &&ユーザー!= nullの
                                        p.SetValue(アイテム、Convert.ToInt32(user.Id)); 
                                    そうでない 場合(p.Name。" Updatedat " && p.GetSetMethod()!= ヌル
                                        p.SetValue(項目、DateTime.Now); 
                                }); 
                            } 

                            // どちらの作成や編集状態
                            IF(isCreateは&&!IsUpdate)
                            { 
                                propertys.ForEachを( P => 
                                { 

                                }); 
                            } 
                        }); 
                    }); 
                } 
            } 
        } 

        /// <要約> 
        /// 清楚敏感词汇
         ///  </要約> 
        ///  <PARAM NAME = "キー"> </ PARAM> 
        ///  <戻り> </戻り> 
        プライベート BOOL IsContainKey(文字列キー)
        { 
            リターン ; 
        } 
    }
コードの表示

 ID値が異なる割り当てのために、操作を追加または変更するかどうかを決定するための要求かどうかを決定することによって存在するコードの実装、。それは彼らの判断に応じて異なる場合があります。

おすすめ

転載: www.cnblogs.com/heshuaiblog/p/11413346.html