ASP.NET Core using MVC with Entity Framework - 编辑方法不显示值
ASP.NET Core using MVC with Entity Framework - Edit method not showing values
我正在使用 ASP.NET 核心 (2.1) 和 MVC,Entity Framework 用于我的学校作业。
我正在尝试为我的模型添加编辑,但实际上编辑视图的字段仍然是空的。
Empty fields
我使用 CSHTML 中的 asp-controller、asp-action 和 asp-route-id 命令从 Admin Controller Index 视图进入此编辑页面以调用另一个控制器方法。我正在使用 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; }
}
}
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 的 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 的编辑Esemeny.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)
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(命名一致)
我正在使用 ASP.NET 核心 (2.1) 和 MVC,Entity Framework 用于我的学校作业。
我正在尝试为我的模型添加编辑,但实际上编辑视图的字段仍然是空的。 Empty fields
我使用 CSHTML 中的 asp-controller、asp-action 和 asp-route-id 命令从 Admin Controller Index 视图进入此编辑页面以调用另一个控制器方法。我正在使用 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; }
}
}
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 的 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 的编辑Esemeny.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)
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(命名一致)