C# & ASP. NET MVC Проблемы с представлением модели и списка - PullRequest
0 голосов
/ 15 марта 2020

У меня есть некоторые проблемы, которые я не могу решить. Я пытаюсь создать список записей с флажком для выбора записи. Первой проблемой, которую я имел, было добавление флажка к модели. Он говорил мне, что это неверный столбец. Поэтому я создал модель представления с добавленным флажком.

Я получаю эту ошибку:

Невозможно неявно преобразовать тип 'System.Collections.GenericList' в System.Collections.Generi c .List '

Вот Контроллер GET:

public ActionResult SelectTags()
{
    TagsModel tags = new TagsModel();
    using (ProjectEntities db = new ProjectEntities())
    {
        tags.Tags = db.Tags.ToList<Tags>();
    }
    return View(tags);
}

Тогда на Посте я получаю:

'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>'

Вот ПОЧТА:

[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)));
}

Я используя 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; }
  }
}

Спасибо за помощь!

1 Ответ

1 голос
/ 15 марта 2020

Вы не можете инициализировать список TagsViewModel со списком Тегов . Не существует неявного преобразования между двумя списками и неявного преобразования между тегами и тегамиViewViewModel.

Вам необходимо самостоятельно реализовать это преобразование.
Одна из возможностей заключается в использовании неявного ключевого слова оператора

Например, вы можете добавить этот код в класс 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 .
На этом этапе код, который присваивает List<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>();
}

Для части POST вы делаете обратное. Добавьте неявное преобразование в класс TagsViewModel

public static implicit operator Tags(TagsViewModel source)
{
    if (source == null) return null;
    Tags model = new Tags();
    model.Id = source.Id;
    .... set the other properties here...
    return model;
}

и используйте foreach l oop для построения списка 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)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...