Search code examples
asp.netasp.net-mvcasp.net-coreasp.net-core-mvcasp.net-core-2.1

ASP.NET Core using MVC with Entity Framework - Edit method not showing values


I'm using ASP.NET Core (2.1) with MVC and Entity Framework for my school homework.

I'm trying to add Edit for my Models, but actually the fields of the Edit view remains empty. Empty fields

I got to this Edit page from the Admin Controller Index view using asp-controller, asp-action and asp-route-id commands in CSHTML to call anouther controllers method. I'm using ViewBag to show 3 models on the Admin Controller's Index page.

Esemeny.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace MVC_Boldizar.Models
{
    public class Esemeny
    {
        [Key]
        public int EsemenyID { get; set; }
        public string Nev { get; set; }
        public int KezdEv { get; set; }
        public int VegEv { get; set; }
        public string Leiras { get; set; }
    }
}

AdminController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MVC_Boldizar.Models;

namespace MVC_Boldizar.Controllers
{
    public class AdminController : Controller
    {
        private IEsemenyRepository EsemenyRepository;
        private INyelvismeretRepository NyelvismeretRepository;
        private IProgramozasiIsmeretRepository ProgramozasiIsmeretRepository;
        private IKapcsolatRepository KapcsolatRepository;

        public AdminController(IEsemenyRepository erepo, INyelvismeretRepository nrepo, IProgramozasiIsmeretRepository prepo, IKapcsolatRepository krepo)
        {
            EsemenyRepository = erepo;
            NyelvismeretRepository = nrepo;
            ProgramozasiIsmeretRepository = prepo;
            KapcsolatRepository = krepo;
        }


        public ActionResult Index()
        {
            ViewBag.Esemenyek = GetEsemenyek();
            ViewBag.Nyelvismeretek = GetNyelvismeretek();
            ViewBag.ProgramozasiIsmeretek = GetProgismeretek();
            ViewBag.Kapcsolatok = GetKapcoslatok();
            return View();
        }

        public IEnumerable<Nyelvismeret> GetNyelvismeretek()
        {
            return NyelvismeretRepository.Nyelvismeretek;
        }
        public IEnumerable<Esemeny> GetEsemenyek()
        {
            return EsemenyRepository.Esemenyek;
        }
        public IEnumerable<ProgramozasiIsmeret> GetProgismeretek()
        {
            return ProgramozasiIsmeretRepository.ProgramozasiIsmeretek;
        }
        public IEnumerable<Kapcsolat> GetKapcoslatok()
        {
            return KapcsolatRepository.Kapcsolatok;
        }
    }
}

EsemenyController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MVC_Boldizar.Models;

namespace MVC_Boldizar.Controllers
{
    public class EsemenyController : Controller
    {

        private IEsemenyRepository EsemenyRepository;
        private INyelvismeretRepository NyelvismeretRepository;
        private IProgramozasiIsmeretRepository ProgramozasiIsmeretRepository;

        public ActionResult Index()
        {
            ViewBag.Esemenyek = GetEsemenyek();
            ViewBag.Nyelvismeretek = GetNyelvismeretek();
            ViewBag.ProgramozasiIsmeretek = GetProgismeretek();
            return View();
        }

        public EsemenyController(IEsemenyRepository erepo, INyelvismeretRepository nrepo, IProgramozasiIsmeretRepository prepo)
        {
            EsemenyRepository = erepo;
            NyelvismeretRepository = nrepo;
            ProgramozasiIsmeretRepository = prepo;
        }


        public IEnumerable<Nyelvismeret> GetNyelvismeretek()
        {
            return NyelvismeretRepository.Nyelvismeretek;
        }
        public IEnumerable<Esemeny> GetEsemenyek()
        {
            return EsemenyRepository.Esemenyek;
        }
        public IEnumerable<ProgramozasiIsmeret> GetProgismeretek()
        {
            return ProgramozasiIsmeretRepository.ProgramozasiIsmeretek;
        }

        public ActionResult CreateEsemeny()
        {
            return View();
        }

        public ActionResult CreaterProg()
        {
            return View();
        }

        public ActionResult CreateNyelv()
        {
            return View();
        }

        public ViewResult EditEsemeny(int esmId) => View(EsemenyRepository.Esemenyek.FirstOrDefault(esm => esm.EsemenyID == esmId));

        public ViewResult EditProg(int proId) => View(ProgramozasiIsmeretRepository.ProgramozasiIsmeretek.FirstOrDefault(pro => pro.ProgramozasiIsmeretID == proId));

        public ViewResult EditNyelv(int nyId) => View(NyelvismeretRepository.Nyelvismeretek.FirstOrDefault(ny => ny.NyelvismeretID == nyId));
    }
}

IEsemenyRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MVC_Boldizar.Models
{
    public interface IEsemenyRepository
    {
        IEnumerable<Esemeny> Esemenyek { get; }

        Esemeny GetEsemenyById(int id);

        void SaveEsemeny(Esemeny esemeny);
    }
}

EFEsemenyRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MVC_Boldizar.Models
{
    public class EFEsemenyRepository : IEsemenyRepository
    {
        private ApplicationDbContext context;

        public EFEsemenyRepository(ApplicationDbContext ctx)
        {
            context = ctx;
        }

        public IEnumerable<Esemeny> Esemenyek => context.Esemenyek;

        public Esemeny GetEsemenyById(int id)
        {
            return context.Esemenyek.Find(id);
        }

        public void SaveEsemeny(Esemeny esemeny)
        {
            if(esemeny.EsemenyID == 0)
            {
                context.Esemenyek.Add(esemeny);
            }
            else
            {
                Esemeny dbEsemeny = context.Esemenyek.FirstOrDefault(esm => esm.EsemenyID == esemeny.EsemenyID);
                if( dbEsemeny != null)
                {
                    dbEsemeny.Nev = esemeny.Nev;
                    dbEsemeny.Leiras = esemeny.Leiras;
                    dbEsemeny.KezdEv = esemeny.KezdEv;
                    dbEsemeny.VegEv = esemeny.VegEv;
                }
            }
            context.SaveChanges();
        }
    }
}

AdminController's Index.cshtml

@using MVC_Boldizar
@model MVC_Boldizar.Models.ViewModels.Szerkesztes

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>Események</th>
        </tr>
    </thead>
    <tbody>
        @foreach (Esemeny esm in ViewBag.Esemenyek)
        {
        <tr>
            <td>
                @esm.EsemenyID
            </td>
            <td>
                @esm.Nev
            </td>
            <td>
                @esm.Leiras
            </td>
            <td>
                @esm.KezdEv
            </td>
            <td>
                @esm.VegEv
            </td>
            <td>
                <a asp-controller="Esemeny" asp-action="EditEsemeny" asp-route-EsemenyID="@esm.EsemenyID">Edit</a> |
                <a asp-action="Details" asp-route-id="@esm.EsemenyID">Details</a> |
                <a asp-action="Delete" asp-route-id="@esm.EsemenyID">Delete</a>
            </td>
        </tr>
        }
    </tbody>
</table>
<hr />
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>Nyelvismeretek</th>
        </tr>
    </thead>
    <tbody>
        @foreach (Nyelvismeret esm in ViewBag.Nyelvismeretek)
        {
            <tr>
                <td>
                    @esm.Nev
                </td>
                <td>
                    <a asp-controller="Esemeny" asp-action="EditNyelv" asp-route-id="@esm.NyelvismeretID">Edit</a> |
                    <a asp-action="Details" asp-route-id="@esm.NyelvismeretID">Details</a> |
                    <a asp-action="Delete" asp-route-id="@esm.NyelvismeretID">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>
<hr />
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>Programozási ismeretek</th>
        </tr>
    </thead>
    <tbody>
        @foreach (ProgramozasiIsmeret esm in ViewBag.ProgramozasiIsmeretek)
        {
            <tr>
                <td>
                    @esm.Nev
                </td>
                <td>
                    <a asp-controller="Esemeny" asp-action="EditProg" asp-route-id="@esm.ProgramozasiIsmeretID">Edit</a> |
                    <a asp-action="Details" asp-route-id="@esm.ProgramozasiIsmeretID">Details</a> |
                    <a asp-action="Delete" asp-route-id="@esm.ProgramozasiIsmeretID">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>
<hr />
<p>
    <a asp-controller="Kapcsolat" asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>Kapcsolatok</th>
        </tr>
    </thead>
    <tbody>
        @foreach (Kapcsolat esm in ViewBag.Kapcsolatok)
        {
            <tr>
                <td>
                    @esm.Nev
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@esm.KapcsolatID">Edit</a> |
                    <a asp-action="Details" asp-route-id="@esm.KapcsolatID">Details</a> |
                    <a asp-action="Delete" asp-route-id="@esm.KapcsolatID">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

EsemenyController's EditEsemeny.cshtml

@model MVC_Boldizar.Models.Esemeny

@{
    ViewData["Title"] = "EditEsemeny";
}

<h2>EditEsemeny</h2>

<h4>Esemeny</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="EditEsemeny" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="EsemenyID" />
            <div class="form-group">
                <label asp-for="Nev" class="control-label"></label>
                <input asp-for="Nev" class="form-control" />
                <span asp-validation-for="Nev" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="KezdEv" class="control-label"></label>
                <input asp-for="KezdEv" class="form-control" />
                <span asp-validation-for="KezdEv" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="VegEv" class="control-label"></label>
                <input asp-for="VegEv" class="form-control" />
                <span asp-validation-for="VegEv" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Leiras" class="control-label"></label>
                <input asp-for="Leiras" class="form-control" />
                <span asp-validation-for="Leiras" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

Szerkesztes.cs (ViewModel for multiple models)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MVC_Boldizar.Models.ViewModels
{
    public class Szerkesztes
    {
        public int SzerkesztesID { get; set; }
        public IEnumerable<Esemeny> IdovonalEsemenyek { get; set; }
        public IEnumerable<Nyelvismeret> IdovonalNyelvismeretek { get; set; }
        public IEnumerable<ProgramozasiIsmeret> IdovonalProgramozasiIsmeretek { get; set; }
        public IEnumerable<Kapcsolat> Kapcsolatok { get; set; }
    }
}

Can anyone notice my fault? Where did I make the mistake?

The database is okay, because it's showing items for Index pages. And in my book, the author uses the same methods (instead of multiple models in one view) and it works for him.


Solution

  • I am guessing route values are not bound correctly. If that is the case, can you either try changing Edit Action from

    public ViewResult EditEsemeny(int esmId)
    

    to

    public ViewResult EditEsemeny(int esemenyID)
    

    (OR) change index view from

    <a asp-controller="Esemeny" asp-action="EditEsemeny" asp-route-EsemenyID="@esm.EsemenyID">Edit</a>

    to

    <a asp-controller="Esemeny" asp-action="EditEsemeny" asp-route-EsmId="@esm.EsmId">Edit</a> 
    

    To summarize, either use esmId or esemenyID in both Edit action and View (consistent naming)