2017-12-21 6 views
2

コントローラから取得した結果に基づいて異なるテキストを表示する際に問題が発生しています。MVCビューとコントローラでifステートメントを使用する

command_status_codeは、表から012の間の値を戻しています。しかし、私はコントローラから得た値に基づいて別のテキストを表示したいと思います。

つまり0を表示したい場合はVerifyと表示したい場合は1と表示するとActiveと表示したいと思います。

チェックをビューに追加するか、コントローラー自体で変換を行うかどうかはわかりません。ここで

は、関連するコードです:

ビュー

@model List<Models.AuditLogs> 

<table> 
    <tr> 
    <th>User</th> 
    <th>Command Status Code</th> 
    </tr> 
    @foreach (var AuditLogsDetail in Model) 
    { 
    <tr> 
    <td>@AuditLogsDetail.user_id</td> 
    <td>@AuditLogsDetail.command_status_code</td> 
    </tr> 
    } 
</table> 

コントローラ

public ActionResult AuditLogs() { 
    string connectionstring = "MY_CONNECTION_STRING"; 
    string sql = "select * from table_name"; 
    SqlConnection conn = new SqlConnection(connectionstring); 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    var Details = new List <AuditLogs>(); { 
     conn.Open(); 
     SqlDataReader rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) { 
      var AuditLogsDetail = new AuditLogs { 
       user_id = rdr["user_id"].ToString(), 
       command_status_code = rdr["command_status_code"].ToString(), 
      }; 
      Details.Add(AuditLogsDetail); 
     } 
    } 
    return View(Details); 
} 

モデルビューで

public class AuditLogs 
    { 
     public string user_id { get; set; } 
     public string command_status_code { get; set; } 
    } 
} 
+0

代わりにEnumを使用していないのはなぜですか? –

+0

@CamiloTerevintoテーブル構造を変更するためのアクセス権がないので、代わりに 'string'を使って作業しています – zaq

+0

@Camilo Terevintoに言及されている列挙型の考え方を再訪することをお勧めします。テーブル構造を変更する必要はありません。必要なintマッピングを持つ列挙型を追加し、次にモデル内でコードを列挙型にキャストします。それはスイッチよりもあまり冗長ではありません。 –

答えて

4

どのビューが呼び出されているかをルーティングまたは制御するためにコントローラを残しておきます(できるだけプレゼンテーションまたはアプリケーションロジックをできるだけコントローラに配置する必要があります)。

この変換はモデルそのものに関連するロジックなので、モデルクラスに属していて、簡単にテストすることができます(複雑になる場合)。カミソリで

public class AuditLogsDetail 
    { 
     public int CommandStatusCode { get; set; } 

     public string CommandStatus 
     { 
      get 
      { 
       switch (CommandStatusCode) 
       { 
        case 0: 
         return "Verify"; 

        case 1: 
         return "Active"; 

        // and so on for the other 12 cases       

        default: 
         // you could throw an exception here or return a specific string like "unknown" 
         throw new Exception("Invalid Command Status Code"); 
       } 
      } 
     } 
    } 

は、あなたを見るだけで呼び出す必要があり:

私は(多くの可能な値があるので)switch文を使用して文字列を返すAuditLogsDetailモデルクラスに新しいプロパティを追加します同様に、このプロパティは:

<tr> 
    <td>@AuditLogsDetail.user_id</td> 
    <td>@AuditLogsDetail.CommandStatus</td> 
</tr> 

あなたはswitch文またはビュー内のif文を入れることができますが、その後、あなたはそれを煩雑にします。これらのステートメントのいくつかがある場合、ビューは読みにくいでしょう。

+0

あなたは '[DataMember]'であることを説明できますか – zaq

+0

@zaqそれを削除します。これはシリアル化のためのものです。モデルクラスがネットワークを介して送信されるとき。私が扱っているアーキテクチャではどのようなことが起こりますか?あなたの場合は必要ないかもしれません。習慣の力。 – Gilles

+0

@zaq CommandStatusCodeはあなたのcommand_status_codeです。それはC#での命名規則で、プロパティ名PascalCaseを書く場合です。しかし、あなたはそれらを書くことができます。 – Gilles

-2

あなたはこのような何かを行うことができます。

+0

「myVarToTest」とは何ですか?また、コードに '​​@ AuditLogsDetail.command_status_code'と表示されるのはなぜですか? – zaq

+0

ああ、私の悪い、@ AuditLogsDetail.command_status_codeでmyVarToTestを置き換えて、あなたが何をしたいかをチェックします:) – MrFlamme26

+0

あなたの答えを編集して変更を反映できますか?誰もが不完全なスニペットを見るのにはあまり役に立ちません。 – zaq

1

これは、列挙型の候補のようです。

enum CommandStatus 
{ 
    def = 0, 
    success = 1, 
    A = 2, 
    B = 3, 
    ... 
} 

public class AuditLogs 
{ 
    public string user_id { get; set; } 
    public CommandStatus command_status_code { get; set; } 
} 

あなたが値をフェッチするときに、ちょうど列挙型にint型にキャスト:

var AuditLogsDetail = new AuditLogs 
       { 
        user_id = rdr["user_id"].ToString(), 
        command_status_code = (CommandStatus)rdr["command_status_code"], 
       }; 

しかしこれは、スイッチの堅牢性を提供していません。

関連する問題