Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#&;具有视图模型和列表的ASP.NET MVC问题_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C#&;具有视图模型和列表的ASP.NET MVC问题

C#&;具有视图模型和列表的ASP.NET MVC问题,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一些我似乎无法解决的问题。我试图做的是生成一个记录列表,其中包含一个复选框来选择该记录。我遇到的第一个问题是将复选框添加到模型中。它告诉我这是一个无效的列。因此,我创建了一个带有添加复选框的视图模型 我得到这个错误: 无法将类型“System.Collections.GenericList”隐式转换为System.Collections.Generic.List 以下是控制器获取: public ActionResult SelectTags() { TagsModel tags =

我有一些我似乎无法解决的问题。我试图做的是生成一个记录列表,其中包含一个复选框来选择该记录。我遇到的第一个问题是将复选框添加到模型中。它告诉我这是一个无效的列。因此,我创建了一个带有添加复选框的视图模型

我得到这个错误:

无法将类型“System.Collections.GenericList”隐式转换为System.Collections.Generic.List

以下是控制器获取:

public ActionResult SelectTags()
{
    TagsModel tags = new TagsModel();
    using (ProjectEntities db = new ProjectEntities())
    {
        tags.Tags = db.Tags.ToList<Tags>();
    }
    return View(tags);
}
public ActionResult SelectTags()
{
TagsModel tags=新的TagsModel();
使用(ProjectEntities db=new ProjectEntities())
{
tags.tags=db.tags.ToList();
}
返回视图(标签);
}
然后在帖子上我得到:

'IEnumerable<TagsViewModel>' does not contain a definition for 'ToList' and the best extention method overload 'Enumerable.ToList<tags>(IEnumerable<Tags>)' requires a reciever of type 'IEnumerable<Tags>'
“IEnumerable”不包含“ToList”的定义,而最佳扩展方法重载“Enumerable.ToList(IEnumerable)”需要类型为“IEnumerable”的接收器
以下是帖子:

[HttpPost]
public ActionResult SelectTags(TagsModel model)
{
    var selectedTags = model.Tags.Where(x => x.IsChecked == true).ToList<Tags>();

    return Content(String.Join(",",selectedTags.Select(x => x.TagsId)));
}
[HttpPost]
公共操作结果选择标记(标记模型)
{
var selectedTags=model.Tags.Where(x=>x.IsChecked==true.ToList();
返回内容(String.Join(“,”,selectedTags.Select(x=>x.TagsId));
}
我正在使用页面上的System.Link

以下是我的模型:

namespace Project.ProjectModels.Entities
{
    public class Tags
    {
      [Key]
      public int TagsId { get; set; }

      [Display(Name = "Id")]
      public string Id { get; set; }

      [Display(Name = "Address")]
      public string DataHmiAddress { get; set; }

      [Display(Name = "Type")]
      public string DataHmiDataType { get; set; }

      [Display(Name = "Round Places")]
      public int DataHmiRoundPlaces { get; set; }

      [Display(Name = "Update In")]
      public int DataHmiUpdateIn { get; set; }

      [Display(Name = "Update Level")]
      public int DataHmiUpdateLevel { get; set; }

      [Display(Name = "Value")]
      [DisplayFormat(DataFormatString = "{0:0.000}", ApplyFormatInEditMode = true)]
      public decimal DataHmiValue { get; set; }

    }
}


namespace Project.ViewModels
{
    public class TagsViewModel
    {
      public int TagsId { get; set; }

      [Display(Name = "Id")]
      public string Id { get; set; }

      [Display(Name = "Address")]
      public string DataHmiAddress { get; set; }

      [Display(Name = "Type")]
      public string DataHmiDataType { get; set; }

      [Display(Name = "Round Places")]
      public int DataHmiRoundPlaces { get; set; }

      [Display(Name = "Update In")]
      public int DataHmiUpdateIn { get; set; }

      [Display(Name = "Update Level")]
      public int DataHmiUpdateLevel { get; set; }

      [Display(Name = "Value")]
      [DisplayFormat(DataFormatString = "{0:0.000}", ApplyFormatInEditMode = true)]
      public decimal DataHmiValue { get; set; }

      public bool IsChecked { get; set; }
  }

  public class TagsModel
  {
    public virtual List<TagsViewModel> Tags { get; set; }
  }
}
namespace Project.ProjectModels.Entities
{
公共类标记
{
[关键]
public int TagsId{get;set;}
[显示(Name=“Id”)]
公共字符串Id{get;set;}
[显示(Name=“Address”)]
公共字符串数据地址{get;set;}
[显示(Name=“Type”)]
公共字符串数据类型{get;set;}
[显示(Name=“圆形位置”)]
public int datahmirroundplaces{get;set;}
[显示(Name=“更新中”)]
public int DataHmiUpdateIn{get;set;}
[显示(Name=“更新级别”)]
public int DataHmiUpdateLevel{get;set;}
[显示(Name=“Value”)]
[DisplayFormat(DataFormatString=“{0:0.000}”,ApplyFormatInEditMode=true)]
公共十进制数据值{get;set;}
}
}
命名空间Project.ViewModels
{
公共类TagsViewModel
{
public int TagsId{get;set;}
[显示(Name=“Id”)]
公共字符串Id{get;set;}
[显示(Name=“Address”)]
公共字符串数据地址{get;set;}
[显示(Name=“Type”)]
公共字符串数据类型{get;set;}
[显示(Name=“圆形位置”)]
public int datahmirroundplaces{get;set;}
[显示(Name=“更新中”)]
public int DataHmiUpdateIn{get;set;}
[显示(Name=“更新级别”)]
public int DataHmiUpdateLevel{get;set;}
[显示(Name=“Value”)]
[DisplayFormat(DataFormatString=“{0:0.000}”,ApplyFormatInEditMode=true)]
公共十进制数据值{get;set;}
已检查公共布尔值{get;set;}
}
公共类标记模型
{
公共虚拟列表标记{get;set;}
}
}

谢谢你的帮助

不能用标记列表初始化标记列表viewmodel。这两个列表之间没有隐式转换,标记和TagsViewModel之间也没有隐式转换

您需要自行实现此转换。
一种可能性是通过

例如,您可以将以下代码添加到Tags类:

public static implicit operator TagsViewModel(Tags source)
{
    if (source == null) return null;
    TagsViewModel model = new TagsViewModel();
    model.Id = source.Id;
    .... set the other properties here...
    return model;
}
现在,我们已经指导Tags类如何将自身转换为TagsViewModel。
此时,分配
列表的代码可以更改为:

public ActionResult SelectTags()
{
    TagsModel tags = new TagsModel();
    using (ProjectEntities db = new ProjectEntities())
    {
        foreach(var t in db.Tags)
           // At this point the Tags t variable will be 
           // converted to a TagsViewModel and added to the list
           tags.Tags.Add(t);
    }
    return View(tags);
}
不要忘记初始化Tags变量内的Tags属性。
将TagsModel类更改为

public class TagsModel
{
    public virtual List<TagsViewModel> Tags { get; set; } = new List<TagsViewModel>();
}
并使用foreach循环构建SelectedTags列表

[HttpPost]
public ActionResult SelectTags(TagsModel model)
{
    List<Tags> selectedTags = new List<Tags>();
    foreach(var t in model.Tags.Where(x => x.IsChecked))
       selectedTags.Add(t);

    return Content(String.Join(",",selectedTags.Select(x => x.TagsId)));
}
[HttpPost]
公共操作结果选择标记(标记模型)
{
List selectedTags=新建列表();
foreach(model.Tags.Where(x=>x.IsChecked)中的var t)
选择标记。添加(t);
返回内容(String.Join(“,”,selectedTags.Select(x=>x.TagsId));
}

我没有理解你的意思?因此,当我将其更改为时,我发现标签中没有ToList的定义,我真的不确定@Steve发生了什么。所有发布的条目现在都消失了??我删除了现在多余的注释,但心不在焉地删除了代码顶部的答案。'运算符“-名称空间不能直接包含字段或方法等成员。和TagViewModel-。隐式运算符TagsViewModel(标记源)用户定义的转换必须转换为或形成封闭类型。因此,这个问题的第二部分是文章。有没有办法用你提供的东西来改变这一点?这篇文章也有同样的问题。您将收到一个标记列表viewmodel,并尝试像使用标记列表一样使用它们。您需要另一个转换,这次是从TagsViewMode到TagsThanks的转换,以获得您的帮助。我相信你有标签的地方;应选择标记。添加(t);列表selectTags=new List()后缺少分号;
[HttpPost]
public ActionResult SelectTags(TagsModel model)
{
    List<Tags> selectedTags = new List<Tags>();
    foreach(var t in model.Tags.Where(x => x.IsChecked))
       selectedTags.Add(t);

    return Content(String.Join(",",selectedTags.Select(x => x.TagsId)));
}