繁体   English   中英

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

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

我将 ASP.NET Core (2.1) 与 MVC 和 Entity Framework 一起用于我的学校作业。

我正在尝试为我的模型添加 Edit,但实际上 Edit 视图的字段仍然是空的。 空字段

我使用 CSHTML 中的 asp-controller、asp-action 和 asp-route-id 命令从 Admin Controller Index 视图进入了这个 Edit 页面,以调用另一个控制器方法。 我正在使用 ViewBag 在管理控制器的索引页面上显示 3 个模型。

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

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

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

谁能注意到我的错? 我在哪里犯了错误?

数据库没问题,因为它显示了索引页面的项目。 在我的书中,作者使用了相同的方法(而不是一个视图中的多个模型)并且对他有用。

我猜路由值没有正确绑定。 如果是这种情况,您可以尝试将编辑操作从

public ViewResult EditEsemeny(int esmId)

public ViewResult EditEsemeny(int esemenyID)

(或)更改索引视图

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

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

总而言之,在编辑操作和视图中使用 esmId 或 esemenyID(一致命名)

暂无
暂无

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

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