如何在Razor视图中使用具有byte类型属性的Entity来呈现复选框

时间:2013-11-29 17:51:42

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

我正在开展一个ASP.NET MVC 4项目。我使用Entity Framework 5Code First工作流程。这是我的实体的一部分:

public class News
{
    //Other properties...
    public byte IsShortNews { get; set; }

}

当我编辑现有新闻时,我想渲染复选框。编译器抱怨无法解析bytebool,所以我尝试了这个:

<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();然后将值从一个对象复制到另一个是为了将一个模型传递给视图......对于像这样的东西来说似乎很多工作。

1 个答案:

答案 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>