我正在开展一个ASP.NET MVC 4
项目。我使用Entity Framework 5
和Code First
工作流程。这是我的实体的一部分:
public class News
{
//Other properties...
public byte IsShortNews { get; set; }
}
当我编辑现有新闻时,我想渲染复选框。编译器抱怨无法解析byte
到bool
,所以我尝试了这个:
<li>
@Html.CheckBoxFor(m => (m.IsShortNews == 1? true : false))
@Html.LabelFor(m => m.IsShortNews, new { @class = "checkbox" })
</li>
我收到了这个错误:
Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
我不确定究竟想告诉我什么,但似乎我不会那么容易解决我的问题。
在网上搜索我找到了这个解决方案:
public byte IsShortNews {get;set;}
[NotMapped]
public bool IsShortNewsBool
{
get { return IsShortNews > 0; }
set { IsShortNews = value ? 1 : 0; }
}
但我之前没有NotMapped
属性的经验,我不知道它是否专门用于该应用程序,但我们认为最好从项目中删除它们,所以我决定寻找另一个溶液
在我创建新闻的视图中,我使用ViewModel,其中IsShortNews
被声明为bool,然后在我的控制器中我只是news.IsShortNews = model.IsShortNews? (byte)1 : (byte)0;
但是我不确定在这里使用viewmodel是一个不错的选择。因为它是数据库中的现有记录,我必须使用实体来获取它:News model = unitOfWork.NewsRepository.GetById(Id);
然后必须使用我的viewmodel类型创建另一个对象 - NewsModel vModel = new NewsModel();
然后将值从一个对象复制到另一个是为了将一个模型传递给视图......对于像这样的东西来说似乎很多工作。
答案 0 :(得分:3)
对于布尔值,您需要将数据库列键入bit
,将类属性设置为bool
,并且不需要执行任何额外的工作来显示复选框。
public class News
{
//Other properties...
public bool IsShortNews { get; set; }
}
HTML
<li>
@Html.CheckBoxFor(m => m.IsShortNews)
@Html.LabelFor(m => m.IsShortNews, new { @class = "checkbox" })
</li>