質問するログイン新規登録

質問編集履歴

6

微修正

2018/05/15 06:36

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
  public static implicit operator string(MyField val)
104
104
  を実装したのでそのまま検証してくれないかな、とちょっと期待したのですがエラーが出ました。
105
- ('MyFieldValue': シール型 'string' から派生することはできません。)
105
+ ('MyField': シール型 'string' から派生することはできません。)
106
106
 
107
107
  **使いたい検証属性を全部実装するしかないでしょうか**。
108
108
 

5

検討3のコメントを修正

2018/05/15 06:36

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -201,8 +201,8 @@
201
201
  }
202
202
  /*
203
203
  model.FugaName
204
- model.Org.FugaName
205
- model.Mod.FugaName
204
+ model.GetFieldValue("1", "FugaName")
205
+ model.GetFieldValue("2", "FugaName")
206
206
  のようにアクセスする
207
207
  */
208
208
  ```

4

HogeModel → HogeRow

2018/05/15 04:46

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -171,7 +171,7 @@
171
171
 
172
172
  このケースについては、以下が気になった為 なしとしました。
173
173
 
174
- HogeModel には更新系のメソッドなども定義しているが、Org や Mod ではそれらのメソッドを呼んで欲しくない。(呼ばなければ良いだけなのですが、呼んでほしくないメソッドが定義されているというのが気になりました)
174
+ HogeRow には更新系のメソッドなども定義しているが、Org や Mod ではそれらのメソッドを呼んで欲しくない。(呼ばなければ良いだけなのですが、呼んでほしくないメソッドが定義されているというのが気になりました)
175
175
  ⇒ なお、サンプルコードでは省いていますが、HogeRow は既に別の基底クラスを継承しています。
176
176
  なので「プロパティだけを定義したクラスを別に作って、Org, Mod はそのクラスで定義、HogeRow はそのクラスを継承」という方法もちょっと難しいです。
177
177
 

3

サンプルコードには無い関数に対する記述があった為修正

2018/05/15 04:44

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -138,10 +138,10 @@
138
138
  public string ModFugaName { get; set; }
139
139
  /*
140
140
  さらに
141
- 「Orgのデータがあるか」 MyField.ExistsOrg() に相当する判定ロジック
141
+ 「Orgのデータがあるか」
142
- 「Modのデータがあるか」 MyField.ExistsMod() に相当する判定ロジック
142
+ 「Modのデータがあるか」
143
- 「上位権限者による編集が行われているか」 MyField.IsModified() に相当する判定ロジック
143
+ 「上位権限者による編集が行われているか」
144
- なども必要
144
+ などの判定ロジック欲しい。MyField のように自作クラス化するならその中に作ってしまえるけど・・・
145
145
  */
146
146
  ...
147
147
  }

2

文言を統一:「ユーザー、管理者」⇒「下位権限者、上位権限者」

2018/05/15 04:31

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -31,8 +31,8 @@
31
31
 
32
32
  var model = new HogeRow();
33
33
  model.FugaName.Value = "ふがふが"; // プロパティ値。
34
- model.FugaName.Org = "フガフガ"; // [参照用として持ちたい] ユーザーが入力した値が入る
34
+ model.FugaName.Org = "フガフガ"; // [参照用として持ちたい] 下位権限者が入力した値が入る
35
- model.FugaName.Mod = "FUGA"; // [参照用として持ちたい] 管理者側で修正した値が入る
35
+ model.FugaName.Mod = "FUGA"; // [参照用として持ちたい] 上位権限者側で修正した値が入る
36
36
 
37
37
  ...
38
38
  public class MyField

1

「追記:そもそもの修正要件」以降を追加

2018/05/15 04:28

投稿

sk_3122
sk_3122

スコア1126

title CHANGED
File without changes
body CHANGED
@@ -9,25 +9,27 @@
9
9
 
10
10
  ↓ 現行
11
11
  ```csharp
12
+ // 一行分のデータのモデル
12
- public class HogeModel
13
+ public class HogeRow
13
14
  {
14
15
  public string FugaName { get; set; } // ★現行はただの string 型プロパティ
15
16
  }
16
17
  ...
17
18
 
18
- var model = new HogeModel();
19
+ var model = new HogeRow();
19
20
  model.FugaName = "ふがふが";
20
21
  ```
21
22
 
22
23
  ↓ こんな感じで持ちたい
23
24
  ```csharp
25
+ // 一行分のデータのモデル
24
- public class HogeModel
26
+ public class HogeRow
25
27
  {
26
28
  public MyField FugaName { get; set; } // ★自作クラス型のプロパティにする
27
29
  }
28
30
  ...
29
31
 
30
- var model = new HogeModel();
32
+ var model = new HogeRow();
31
33
  model.FugaName.Value = "ふがふが"; // プロパティ値。
32
34
  model.FugaName.Org = "フガフガ"; // [参照用として持ちたい] ユーザーが入力した値が入る
33
35
  model.FugaName.Mod = "FUGA"; // [参照用として持ちたい] 管理者側で修正した値が入る
@@ -84,7 +86,8 @@
84
86
  - 件のモデルでは、検証属性を色々使っています。
85
87
 
86
88
  ```csharp
89
+ // 一行分のデータのモデル
87
- public class HogeModel
90
+ public class HogeRow
88
91
  {
89
92
  [Required]
90
93
  [StringLength(10, ErrorMessage = "10桁以下で入力してください")]
@@ -103,6 +106,108 @@
103
106
 
104
107
  **使いたい検証属性を全部実装するしかないでしょうか**。
105
108
 
109
+
110
+ ### 追記:そもそもの修正要件
111
+
112
+ 現状、単純に
113
+ 「下位権限者が入力する」
114
+ 「それを上位権限側で確認する(参照するのみ)」
115
+ というシステムがあります。
116
+
117
+ それに対し、
118
+ 「上位権限者側でも修正を入れたい」
119
+ という要件が上がってきました。
120
+
121
+ なので、それぞれの入力フィールドに対し
122
+ 「下位権限者による入力値」Org
123
+ 「上位権限者による入力値」Mod
124
+ 「最終的な採用値」Value
125
+ を持ちたいと思っています。
126
+ (Org, Mod は画面表示用として持ちたいだけ)
127
+
128
+ #### 検討1:それぞれプロパティを個別に用意する
129
+
130
+ まず考えたのは以下ですが、プロパティが多く、同様のモデルも多い為、ひとまず無しとしました。
131
+
132
+ ```csharp
133
+ // 一行分のデータのモデル
134
+ public class HogeRow
135
+ {
136
+ public string FugaName { get; set; }
137
+ public string OrgFugaName { get; set; }
138
+ public string ModFugaName { get; set; }
139
+ /*
140
+ さらに
141
+ 「Orgのデータがあるか」 MyField.ExistsOrg() に相当する判定ロジック
142
+ 「Modのデータがあるか」 MyField.ExistsMod() に相当する判定ロジック
143
+ 「上位権限者による編集が行われているか」 MyField.IsModified() に相当する判定ロジック
144
+ なども必要
145
+ */
146
+ ...
147
+ }
148
+ ```
149
+
150
+ ##### 検討2:モデルの入れ子にする
151
+
152
+ 次に以下のパターンも考えました。
153
+
154
+ ```csharp
155
+ // 一行分のデータのモデル
156
+ public class HogeRow
157
+ {
158
+ public HogeRow Org { get; }
159
+ public HogeRow Mod { get; }
160
+
161
+ public string FugaName { get; set; }
162
+ ...
163
+ }
164
+ /*
165
+ model.FugaName
166
+ model.Org.FugaName
167
+ model.Mod.FugaName
168
+ のようにアクセスする
169
+ */
170
+ ```
171
+
172
+ このケースについては、以下が気になった為 なしとしました。
173
+
174
+ ・HogeModel には更新系のメソッドなども定義しているが、Org や Mod ではそれらのメソッドを呼んで欲しくない。(呼ばなければ良いだけなのですが、呼んでほしくないメソッドが定義されているというのが気になりました)
175
+ ⇒ なお、サンプルコードでは省いていますが、HogeRow は既に別の基底クラスを継承しています。
176
+ なので「プロパティだけを定義したクラスを別に作って、Org, Mod はそのクラスで定義、HogeRow はそのクラスを継承」という方法もちょっと難しいです。
177
+
178
+ ・やはり プロパティ単位で Org や Mod を扱いたい。
179
+ (model.Org.FugaName ではなく model.FugaName.Org で扱いたい)
180
+ 「上位権限者による編集が行われているか」の判定等をするのにもその方がやりやすいので・・・
181
+
182
+
183
+ #### 検討3:ディクショナリで持つ
184
+
185
+ 参照用の値はディクショナリに溜めようかとも考えたのですが、
186
+ 文字列でアクセスするのがちょっと嫌だったので却下しました。
187
+
188
+ ```csharp
189
+ // 一行分のデータのモデル
190
+ public class HogeRow
191
+ {
192
+ public string FugaName { get; set; }
193
+ ...
194
+
195
+ // key=権限区分@プロパティ名で Org, Mod の値を持つ
196
+ private Dictionary<string, string> dict = new Dictionary<string, string>();
197
+ public string GetFieldValue(string kengenKbn, string fieldName)
198
+ {
199
+ // 取得用メソッドなどを用意
200
+ }
201
+ }
202
+ /*
203
+ model.FugaName
204
+ model.Org.FugaName
205
+ model.Mod.FugaName
206
+ のようにアクセスする
207
+ */
208
+ ```
209
+
210
+
106
211
  -----
107
212
 
108
213
  以上です。