asp.net-mvc

Can't convert from int to "classname"


While building a ASP.NET-MVC website I was trying to implement a EDIT page on my website, but I'm having some difficulties, particulary in my Controller. The error is in this class, pointing to the ID:

 public IActionResult Edit(int ID = 0)
            {
                GestaoAlertas _teste = addresses.Contains(ID);
                return View(_teste);
            }

And the error says:

It is not possible to convert from int to "hdsportal.GestaoAlertas"

Controller:

    public class HomeController : Controller
    {

        SqlCommand com = new SqlCommand();
        SqlDataReader dr;
        SqlConnection con = new SqlConnection();
        List<GestaoAlertas> addresses = new List<GestaoAlertas>();

        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
            con.ConnectionString = "secret";
        }

        public IActionResult Gestao_Alertas()
        {
            FetchData();
            return View(addresses);
        }

        [Route("")]
        public IActionResult Index()
        {
            FetchData();
            return View(addresses);
        }

        public IActionResult Edit(int ID = 0)
        {
            GestaoAlertas _teste = addresses.Contains(ID);
            return View(_teste);
        }

        public IActionResult Privacidade()
        {
            return View();
        }

        public IActionResult Gestao_Utilizadores()
        {
            return View();
        }

        public IActionResult Contatos()
        {
            return View();
        }

        public IActionResult QuemSomos()
        {
            return View();
        }

        private void FetchData()
        {
                if (addresses.Count > 0)
                {

                    addresses.Clear();
                }
                try
                {
                    con.Open();
                    com.Connection = con;
                    com.CommandText = "SELECT [ID], [SYSTEM_NAME], [SYSTEM_STATUS], [SYSTEM_SHORTMSG] FROM [CORE_SYS_STATUS]";
                    dr = com.ExecuteReader();
                    while (dr.Read())
                    {
                        addresses.Add(new GestaoAlertas()
                        {
                            ID = (int)dr["ID"]
                        ,
                            SYSTEM_NAME = dr["SYSTEM_NAME"].ToString()
                        ,
                            SYSTEM_STATUS = dr["SYSTEM_STATUS"].ToString()
                        ,
                            SYSTEM_SHORTMSG = dr["SYSTEM_SHORTMSG"].ToString()

                        });
                    }
                    con.Close();
                    }
                catch (Exception ex)
                {
                   throw ex;
                }
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
  

Model:

public class GestaoAlertas
    {
        public int ID { get; set; }
        public string SYSTEM_NAME { get; set; }
        public string SYSTEM_STATUS { get; set; }
        public string SYSTEM_SHORTMSG { get; set; }
    }

Solution

  • Issue & Concern

    According to List<T>.Contains(T), you need parse T object which is GestaoAlertas object to your addresses (List<GestaoAlertas> type).

    Hence, you get the error below as it is an unmatched type with int

    It is not possible to convert from int to "hdsportal.GestaoAlertas"

    for this line:

    GestaoAlertas _teste = addresses.Contains(ID);
    

    And List<T>.Contains(T) returns the boolean result.

    public bool Contains (T item);
    

    Determines whether an element is in the List.


    Solution(s)

    Assumptions:

    1. addresses contain GestaoAlertas records

    You can get GestaoAlertas element from addresses by ID with either of these LINQ methods:

    Pre-requisite:

    Import System.Linq namespace.

    using System.Linq;
    

    Solution 1: Enumerable.SingleOrDefault

    Returns a single, specific element of a sequence, or a default value if that element is not found.

    Note: It will throw InvalidOperationException if input sequence contains more than one element. Good to be use for unique identifier such as ID.

    GestaoAlertas _teste = addresses.SingleOrDefault(x => x.ID == ID);
    

    Solution 2: Enumerable.Single

    Returns a single, specific element of a sequence.

    Note: It will throw ArgumentNullException if it returns null.

    GestaoAlertas _teste = addresses.Single(x => x.ID == ID);
    

    Solution 3: Enumerable.FirstOrDefault

    Returns the first element of a sequence, or a default value if no element is found.

    GestaoAlertas _teste = addresses.FirstOrDefault(x => x.ID == ID);
    

    Solution 4: Enumerable.First

    Returns the first element of a sequence.

    Note: It will throw ArgumentNullException if it returns null.

    GestaoAlertas _teste = addresses.First(x => x.ID == ID);