ASP.NET Core MVC中如何将列的0/1值转换为Open/Closed展示
问题解决方案
首先修正你现有代码的问题
你的原有代码存在3个致命错误:
- 两个属性的
get方法互相调用,会触发无限递归,最终抛出栈溢出异常 - 映射逻辑写反,需求为1对应
Open、0对应Closed,原有代码1返回的是Closed - 语法错误:
else后不能直接跟判断条件,需要改为else if
第一步:修改ViewModel定义
直接新增只读计算属性返回映射后的文本,避免互相调用:
// 存储数据库读取的原始0/1值,Controller从数据库查值后赋值给这个属性 public int Closed { get; set; } // 只读计算属性,直接根据原始值返回映射文本 public string ClosedStatus { get { return Closed == 1 ? "Open" : "Closed"; } }
第二步:Controller端处理
不需要做额外的转换逻辑,只需要在读取数据库数据时,把原始的Closed字段值赋值给ViewModel的对应属性即可,示例代码:
public ActionResult YourPageAction() { // 从数据库查询原始数据,映射到ViewModel var bdgList = _dbContext.Bdgfixmonths.Select(dbItem => new BdgfixmonthViewModel { Closed = dbItem.Closed, // 直接赋值数据库的0/1原始值 // 其他需要的字段赋值 }).ToList(); // 封装到页面对应的总ViewModel var pageViewModel = new YourPageViewModel { Bdgfixmonths = bdgList }; return View(pageViewModel); }
第三步:视图中访问ViewModel属性
直接调用我们新增的计算属性即可,不需要访问原始的Closed字段:
<tbody> @foreach (var item in Model.Bdgfixmonths) { <td> @item.ClosedStatus <!-- 也可以用DisplayFor写法:@Html.DisplayFor(modelItem => item.ClosedStatus) --> </td> } </tbody>
关于访问ViewModel变量的说明
只要你在ViewModel中定义了对应的属性,Controller完成赋值后,视图中就可以直接通过item.属性名访问,不需要关联原始数据库实体的字段,完全和数据库Model解耦。
内容的提问来源于stack exchange,提问作者chdev
相关产品推荐
相关产品推荐

