2017-02-01 9 views
3

以前の開発者(私たちともう働いていないので、私は彼に尋ねることができません)はかなり滑らかで、私は本当に理解していません。データベースでどの列挙型が選択されているのですか?

[Flags] 
    public enum SidingTypePreference 
    { 
     [Value(Name = "Vinyl")] 
     Vinyl = 1, 
     [Value(Name = "Metal or Aluminum")] 
     MetalOrAluminum = 2, 
     [Value(Name = "Composite")] 
     Composite = 4, 
     [Value(Name = "Wood")] 
     Wood = 8, 
     [Value(Name = "Other")] 
     Other = 16 
    } 

SidingTypesが選択されたすべての値の合計である単一のintとして格納されます。私たちは、この列挙を持っています。

Model.SidingTypes = table.SidingTypes 

とビューで:

tableは、クエリからわずか行結果である制御装置において

public SidingTypePreference? SidingTypes { get; set; } 

:モデルで

enter image description here

@Html.EditorFor(m => Model.SidingTypes, new { @class = "form-control input-sm", GroupID = "SidingTypePreference", Cols = 1 }) 

しかし、私が理解していない部分があります。 SidingTypes = 10としましょう

<input type="checkbox" class="..." name="SidingTypes_0" value="1"> Vinyl 
<input type="checkbox" class="..." name="SidingTypes_1" value="2" checked> Metal or Aluminum 
<input type="checkbox" class="..." name="SidingTypes_2" value="4"> Composite 
<input type="checkbox" class="..." name="SidingTypes_3" value="8" checked> Wood 
<input type="checkbox" class="..." name="SidingTypes_4" value="16"> Other 

(「ルックアップチェックボックス - SidingTypes」クラスだけでスクロールする必要性を防ぐために編集さが、彼らはすべてです。)

:ブードゥー教の魔法のいくつかの並べ替えすることにより、そのint型をに翻訳されそのintの値から、チェックされたものとされなかったものが分かります。

最初の質問:このネイティブ.NETですか?または、私が見つける必要のある拡張メソッドやテンプレートがありますか?

第2質問:私は何かと独立して、列挙型が選択されているかどうかを判断するメソッドを作成します。

ような何か:私は(今数年前)にチェック

private bool IsSelected(int SidingTypes, SidingTypePreference sidingTypePreference) 
{ 
    ... ?? ... 
    return true or false; 
} 
+4

'Flags'属性を持つenumは、合成値を構成する等価ビットに値を分解します(例:' 10 = 2 + 8')。プロジェクトにカスタムテンプレートがあると思われます。列挙型の値をチェックボックスのセットに追加します。 –

+1

これをチェックしてください:https://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspxまた、このポストは非常に良い答えがあります:http://stackoverflow.com/質問/ 8447/what-does-the-flags-enum-attribute-in-c – Magnetron

+0

[この回答を参照してください(http://stackoverflow.com/questions/37990786/how-to-reduce-code-duplication- in-asp-net-mvc-view-when-working-with-flags-enum/37991402#37991402) '[Flags]'属性を持つenumでの作業のため –

答えて

2

このネイティブ.NETはありますか?

その一部です。 Flags属性を持つ列挙型は、値をその合成値を構成する等価ビットに分解する。10 = 2 + 8)

この値をチェックボックスのセットに変換することは、ネイティブではありません。私は、プロジェクトにカスタムテンプレートがあり、列挙型の値をチェックボックスのセットに変換すると思われます。

列挙型が選択されているかどうかを判断する方法を教えてください。 SidingTypessidingTypePreference両方で「選択」されているビットと数が返され&オペレータので

private bool IsSelected(int SidingTypes, SidingTypePreference sidingTypePreference) 
{ 
    return (SidingTypes & (int)sidingTypePreference) != 0; 
} 

ちょうどビット演算を使用します。フラグが一致しない場合、結果はすべてゼロになります。したがって、0以外の数字は一致を示します。

+1

このチェックを行うEnum、HasFlag(Enumフラグ)メソッドのメソッドがあります。 – Fran

+0

ありがとうD Stanley。しかし、1つの質問。上記の例では、次のようになります。演算子 '&'をInt型とSidingTypePrefrences型のオペランドに適用できません。 –

+0

@CaseyCrookston int型とenum型をチェックしていません。私は操作を許可するためにintにキャストを追加しました。もちろん、 –

2

最後に、ASP.NET MVCは、組み込みのテンプレート、このようなフラグ列挙型のために持っていませんでした。しかし、開発者がこのタイプを認識するためにcustom editor templateを作成した(または一般的にenumにフラグを立てる)可能性があります。

Views/Shared/EditorTemplates/のファイル、特にSidingTypePreference.cshtmlまたはObject.cshtmlという名前のファイルをチェックしてください。また、プロジェクト内のどこでもlookup-checkbox-の全文検索を行うと役立ちます。

Dスタンレーの答えは正しいです:ビット単位の&演算子を目的の値に対して使用し、結果が非​​ゼロであるかどうかを確認します。

+1

ありがとうございました! lookup-checkboxの検索を行うヒントが表示されました。テンプレートが見つかりました。 –

+0

また、私はあなたのユーザー名について尋ねる必要があります... StriplingWarrior。それが何であるかを私が尋ねると、心配します:-)? –

+0

@CaseyCrookston:戦闘で神の保護を受けたような信仰を示した若い兵士の会社についてモルモン書に記されています。現代のLDS文化では、彼らはしばしば[Stripling Warriors](https://en.wikipedia.org/wiki/Two_thousand_stripling_warriors)と呼ばれています。 「ストリップリング」は単に「若い」という意味です。私が若い頃に私はユーザー名/電子メールを採用しました。 :-) – StriplingWarrior

関連する問題