根据我从控制器获得的结果显示不同文本时出现问题。
列command_status_code
从表中返回0
到12
之间的值。但是,我想根据从控制器获得的值显示不同的文本。
即如果我得到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 :(得分: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>