如何在视图中显示一对一关系双方的数据并在提交时更新正确的表?

问题描述 投票:0回答:1

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

当我将成员模型传递到编辑视图时,它识别出有一个与其关联的信封。

我有两个问题:

  1. 我无法在编辑字段中显示信封中的信封编号 - 它显示为空白
  2. 我希望能够在用户单击“提交”时更新信封表(会员和信封有一个单独的“提交”按钮)。

下面是我正在使用的 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");}
}
html entity-framework-core asp.net-core-mvc
1个回答
0
投票

我无法在编辑字段中显示信封中的信封编号 - 它显示为空白

您可以使用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.