简体   繁体   English

ASP.NET Core 使用 MVC 和 Entity Framework - 编辑方法不显示值

[英]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.我将 ASP.NET Core (2.1) 与 MVC 和 Entity Framework 一起用于我的学校作业。

I'm trying to add Edit for my Models, but actually the fields of the Edit view remains empty.我正在尝试为我的模型添加 Edit,但实际上 Edit 视图的字段仍然是空的。 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.我使用 CSHTML 中的 asp-controller、asp-action 和 asp-route-id 命令从 Admin Controller Index 视图进入了这个 Edit 页面,以调用另一个控制器方法。 I'm using ViewBag to show 3 models on the Admin Controller's Index page.我正在使用 ViewBag 在管理控制器的索引页面上显示 3 个模型。

Esemeny.cs 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管理控制器.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 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 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 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 AdminController 的 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 EsemenyController 的 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) Szerkesztes.cs(多个模型的视图模型)

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.在我的书中,作者使用了相同的方法(而不是一个视图中的多个模型)并且对他有用。

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)总而言之,在编辑操作和视图中使用 esmId 或 esemenyID(一致命名)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM