在MVC视图和控制器中使用if语句

时间:2017-12-21 15:19:41

标签: c# asp.net asp.net-mvc

根据我从控制器获得的结果显示不同文本时出现问题。

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; }
    }
}

3 个答案:

答案 0 :(得分:4)

我会离开Controller来路由或控制调用哪个视图(这应该是它的工作,你应该尽可能少地在控制器中放置演示或应用程序逻辑)。

由于此转换是与模型本身相关的逻辑,因此我会将其放在它所属的Model类中,并且可以轻松测试(如果它变得更复杂)。

我会在AuditLogsDetail模型类中添加一个新属性,它将使用switch语句返回一个字符串(因为有许多可能的值):

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");
                }
            }
        }
    }

在Razor视图中,您只需要同样调用此属性:

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

您可以在视图中放置switch语句或if语句,但这样会使其混乱。如果你有几个这样的陈述,那么这个观点很难阅读。

答案 1 :(得分: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"],
                };

然而,这并没有提供开关的稳健性。

答案 2 :(得分:-2)

在您的视图中,您可以执行以下操作:

@model List<Models.AuditLogs>

<table>
  <tr>
    <th>User</th>
    <th>Command Status Code</th>
  </tr>
  @foreach (var AuditLogsDetail in Model)
  {
  @if (@AuditLogsDetail.command_status_code == 0)
  {
    // what i need to do
  }
  @else if (@AuditLogsDetail.command_status_code == 1)
  {
    // what i need to do
  }
  <tr>
    <td>@AuditLogsDetail.user_id</td>
    <td>@AuditLogsDetail.command_status_code</td>
  </tr>
  }
</table>