我正在使用enitity框架制作测试博客应用程序,并遇到了这个错误:
"无法创建类型' TestBlog.Models.Tag'的常量值。只要 在此上下文中支持原始类型或枚举类型。"
我正在使用asp.net MVC,其中viewmodels在我的视图和控制器之间传递数据。
在我的ActionResult编辑帖子的控制器中,我有这样的说法:
return View("Form", new PostsForm
{
Tags = TestBlog.Tags.Select(tag => new TagCheckBox
{
Id = tag.Id,
Name = tag.Name,
IsChecked = post.Tags.Contains(tag)
}).ToList()
});
我也试过这个版本:
return View("Form", new PostsForm
{
Tags = (from item in TestBlog.Tags
select item).Select(tag => new TagCheckBox
{
Id = tag.Id,
Name = tag.Name,
IsChecked = post.Tags.Contains(tag)
}).ToList()
});
问题似乎是由以下原因造成的:
IsChecked = post.Tags.Contains(tag)
当我评论该声明时,它不再显示错误。
这是我的Tag.cs模型
public class Tag
{
public Tag()
{
this.Posts = new HashSet<Post>();
}
public int Id { get; set; }
public string Slug { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
这是我的viewmodels:
public class TagCheckBox
{
public int? Id { get; set;}
public string Name { get; set; }
public bool IsChecked { get; set;}
}
public class PostsForm
{
public bool IsNew { get; set; }
public int? PostId { get; set; }
[Required, MaxLength(128)]
public string Title { get; set; }
[Required, MaxLength(128)]
public string Slug { get; set; }
[Required, DataType(DataType.MultilineText)]
public string Content { get; set; }
public IList<TagCheckBox> Tags { get; set; }
}
非常感谢任何建议。
谢谢
答案 0 :(得分:1)
IsChecked = post.Tags.Select(x => x.Id).Contains(tag.Id)
<强>更新
但实际上,设置了导航属性属性后,您应该可以调用:
Tags = post.Tags.Select(x => new TagCheckBox { Id = x.Id, Name = x.Name, IsChecked = x.IsChecked }).ToList();
答案 1 :(得分:1)
EF不知道您的类TagCheckBox,也无法在SQL中创建它的实例。试试吧。
(无法通过手机设置格式,道歉)。
return View("Form", new PostsForm
{
Tags = (from item in TestBlog.Tags
select item).Select(tag => new
{
Id = tag.Id,
Name = tag.Name,
IsChecked = post.Tags.Any(t => t.Id == tag.Id)
}).
.AsEnumerable()
.Select(tag => new TagCheckBox
{
Id = tag.Id,
Name = tag.Name,
IsChecked = tag.IsChecked
})
.ToList()
});