我有 2 个名为 Member & Envelope 的模型类,如下所示,其中 Member 与 Envelope 具有 1 对 1 的关系:
namespace Mapping.Models
{
public class Member
{
[Key]
public int MemberId { get; set; }
[Required]
[Display(Name = "Mailing Name")]
[StringLength(250)]
public string? MemberMailingName { get; set; }
[Required]
[Display(Name = "Family Name")]
[StringLength(250)]
public string? MemberFamilyName { get; set; }
[Required]
[Display(Name = "Status")]
[StringLength(10)]
public string? MemberStatus { get; set; }
// Navigation Properties
public virtual Envelope? Envelope { get; set; }
}
public class Envelope
{
[Key]
public int EnvelopeId { get; set; }
[Required]
[Display(Name = "Envelope Number")]
public int EnvelopeNumber { get; set; }
}
}
当我将成员模型传递到编辑视图时,它识别出有一个与其关联的信封。
我有两个问题:
下面是我正在使用的 Edit 和 Edit.cshtml 的 MembersController 方法(请不要判断蹩脚的 HTML - 一旦它正常工作,我会将其全部清理掉!)
提前感谢您提供任何帮助!!
MembersController 中的编辑方法:
// GET: Members/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var member = await _context.Member.FindAsync(id);
if (member == null)
{
return NotFound();
}
return View(member);
}
编辑.cshtml:
@model StJosephMapping.Models.Member
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Member</h4>
<hr />
<div class="row">
<div class="col-md-12">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="MemberId" />
<span>
<table style="float: left;">
<tr>
<th style="width:25%;">
<label asp-for="MemberMailingName" class="control-label"></label>
</th>
<th style="width:25%;">
<label asp-for="MemberFamilyName" class="control-label"></label>
</th>
<th style="width:25%;">
<label asp-for="MemberStatus" class="control-label"></label>
</th>
</tr>
<tr>
<td>
<input asp-for="MemberMailingName" class="form-control" />
</td>
<td>
<input asp-for="MemberFamilyName" class="form-control" />
</td>
<td>
<input asp-for="MemberStatus" class="form-control" />
</td>
</tr>
<tr>
<td>
<span asp-validation-for="MemberMailingName" class="text-danger"></span>
</td>
<td>
<span asp-validation-for="MemberFamilyName" class="text-danger"></span>
</td>
<td>
<span asp-validation-for="MemberStatus" class="text-danger"></span>
</td>
</tr>
</table>
<table style="display: inline-block;">
<tr>
<td>
<div class="form-group" style="margin-top: 26px;">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</td>
</tr>
</table>
</span>
</form>
</div>
</div>
<br />
<h4>Envelope</h4>
<hr />
<div class="row">
<div class="col-md-12">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="MemberId" />
<span>
<table style="float: left;">
<tr>
<th style="width:25%;">
<label asp-for="Envelope.EnvelopeNumber" class="control-label"></label>
</th>
</tr>
<tr>
<td>
<input asp-for="Envelope.EnvelopeNumber" class="form-control" />
</td>
</tr>
<tr>
<td>
<span asp-validation-for="Envelope.EnvelopeNumber" class="text-danger"></span>
</td>
</tr>
</table>
<table style="display: inline-block;">
<tr>
<td>
<div class="form-group" style="margin-top: 26px;">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</td>
</tr>
</table>
</span>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
我无法在编辑字段中显示信封中的信封编号 - 它显示为空白
您可以使用 Entity Framework Core 中的
Include
方法来完成此操作:
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.Member == null)
{
return NotFound();
}
//var member = await _context.Member.FindAsync(id);
var member = await _context.Member.Include(a => a.Envelope).FirstOrDefaultAsync(a=>a.MemberId==id);
if (member == null)
{
return NotFound();
}
return View(member);
}
我希望能够在用户单击时更新信封表 提交(会员和会员有一个单独的提交按钮 信封)。
您需要确保
EnvelopeId
包含在表单中,以便控制器可以识别哪个 Envelope
需要更新。
更改您的 Edit.cshtml,如下所示:
<div class="row">
<div class="col-md-12">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="MemberId" />
<span>
<table style="float: left;">
<tr>
<th style="width:25%;">
<label asp-for="MemberMailingName" class="control-label"></label>
</th>
<th style="width:25%;">
<label asp-for="MemberFamilyName" class="control-label"></label>
</th>
<th style="width:25%;">
<label asp-for="MemberStatus" class="control-label"></label>
</th>
</tr>
<tr>
<td>
<input asp-for="MemberMailingName" class="form-control" />
</td>
<td>
<input asp-for="MemberFamilyName" class="form-control" />
</td>
<td>
<input asp-for="MemberStatus" class="form-control" />
</td>
</tr>
<tr>
<td>
<span asp-validation-for="MemberMailingName" class="text-danger"></span>
</td>
<td>
<span asp-validation-for="MemberFamilyName" class="text-danger"></span>
</td>
<td>
<span asp-validation-for="MemberStatus" class="text-danger"></span>
</td>
</tr>
</table>
<table style="display: inline-block;">
<tr>
<td>
<div class="form-group" style="margin-top: 26px;">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</td>
</tr>
</table>
</span>
</form>
</div>
</div>
<br />
<h4>Envelope</h4>
<hr />
<div class="row">
<div class="col-md-12">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<!-- change here -->
<input type="hidden" asp-for="Envelope.EnvelopeId" />
<span>
<table style="float: left;">
<tr>
<th style="width:25%;">
<label asp-for="Envelope.EnvelopeNumber" class="control-label"></label>
</th>
</tr>
<tr>
<td>
<input asp-for="Envelope.EnvelopeNumber" class="form-control" />
</td>
</tr>
<tr>
<td>
<span asp-validation-for="Envelope.EnvelopeNumber" class="text-danger"></span>
</td>
</tr>
</table>
<table style="display: inline-block;">
<tr>
<td>
<div class="form-group" style="margin-top: 26px;">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</td>
</tr>
</table>
</span>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
编辑动作:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,Member member)
{
if(member.MemberId!=0)
{
if (id != member.MemberId)
{
return NotFound();
}
if (ModelState.IsValid)
{
//edit the member
try
{
_context.Update(member);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MemberExists(member.MemberId))
{
return NotFound();
}
else
{
throw;
}
}
//do you stuff...
return RedirectToAction(nameof(Index));
}
}
else
{
//edit the envelope
if(member.Envelope!=null)
{
try
{
_context.Update(member.Envelope);
await _context.SaveChangesAsync();
}
catch (Exception)
{
throw;
}
return RedirectToAction(nameof(Index));
//do you stuff...
}
}
return View(member);
}