【问题标题】:How do I pass master id to detail foreign key?如何将主 ID 传递给详细外键?
【发布时间】:2021-07-06 03:41:08
【问题描述】:

我的主从编辑无法正常工作。

TaBarHeader - master 和 TaBarBody - detail,有一对多的关系:

public partial class TaBarHeader
   {
        [Key]
        public int Id { get; set; }
        public string ListaOtf { get; set; }
        public IEnumerable<TaBarBody> TaBarBodies { get; set; }
        public IEnumerable<TaBarTelegrama> TaBarTelegramas { get; set; }
  }

public partial class TaBarBody
   {
        [Key]
        public int Id { get; set; }
        public string Codstatie1 { get; set; }
        public int BarHeaderId { get; set; }
        [ForeignKey("BarHeaderId")]
        public TaBarHeader BarHeaderFk { get; set; }
   }

HeaderTelegrama/Details.cshtml:

@model TraficAlert.Models.ViewModels.HeaderTelegramaViewModel
        <dt class="col-sm-2">
          @Html.DisplayNameFor(model => model.TaBarHeader.ListaOtf)
        </dt>
        <dd class="col-sm-10">
          @Html.DisplayFor(model => model.TaBarHeader.ListaOtf)
        </dd>
(...)
          <th>
              @Html.DisplayNameFor(model => model.TaBarBody.Codstatie1)
          </th>

        @foreach (var item in Model.TaBarHeader.TaBarBodies)
        {
           <tr>
              <td>
                  @Html.DisplayFor(modelItem => item.Codstatie1)
              </td>

<a asp-controller="BodyTelegrama" asp-action="Edit" asp-route-id="@item.Id">Edit</a>

BodyTelegrama/Edit.cshtml:

@model TraficAlert.Models.ViewModels.BodyTelegramaViewModel
@{
    ViewData["Title"] = "Edit";
}

<h1>Edit</h1>

<h4>TaBarBody</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
                <label asp-for="@Model.TaBarBody.Codstatie1" class="control-label">Cod Statie 1</label>
                <input asp-for="@Model.TaBarBody.Codstatie1" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.Codstatie1" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.Codstatie2" class="control-label">Cod Statie 2</label>
                <input asp-for="@Model.TaBarBody.Codstatie2" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.Codstatie2" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.DtIniP" class="control-label">Data Ini P</label>
                <input asp-for="@Model.TaBarBody.DtIniP" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.DtIniP" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.DtFinP" class="control-label">Data Fin P</label>
                <input asp-for="@Model.TaBarBody.DtFinP" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.DtFinP" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.DtIniR" class="control-label">Data Ini R</label>
                <input asp-for="@Model.TaBarBody.DtIniR" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.DtFinP" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.DtFinR" class="control-label">Data Fin R</label>
                <input asp-for="@Model.TaBarBody.DtFinR" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.DtFinR" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.KmIni" class="control-label">Km Ini</label>
                <input asp-for="@Model.TaBarBody.KmIni" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.KmIni" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.KmFin" class="control-label">Km Fin</label>
                <input asp-for="@Model.TaBarBody.KmFin" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.KmFin" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.LiniaFir" class="control-label">Linia Fir</label>
                <input asp-for="@Model.TaBarBody.LiniaFir" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.LiniaFir" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.NomImpactId" class="control-label">Impact</label>
                <select asp-for="@Model.TaBarBody.NomImpactId" class="form-control" asp-items="ViewBag.NomImpactId"></select>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.NomAnulatId" class="control-label">Anulat</label>
                <select asp-for="@Model.TaBarBody.NomAnulatId" class="form-control" asp-items="ViewBag.NomAnulatId"></select>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.MotivAnulare" class="control-label">Motiv Anulare</label>
                <input asp-for="@Model.TaBarBody.MotivAnulare" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.MotivAnulare" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="@Model.TaBarBody.Ruta" class="control-label">Ruta</label>
                <input asp-for="@Model.TaBarBody.Ruta" class="form-control" />
                <span asp-validation-for="@Model.TaBarBody.Ruta" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" asp-route-id="@ViewBag.TelegramaId" value="Save" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

BodyTelegramaController:

// GET
    public IActionResult Edit(int id, int HeaderTelegramaId)
    {
        BodyTelegramaViewModel bodyTelegramaViewModel = new BodyTelegramaViewModel();
        bodyTelegramaViewModel.TaBarBody = new TaBarBody();
        bodyTelegramaViewModel.TaBarBody.BarHeaderFk = new TaBarHeader();
        bodyTelegramaViewModel.TaBarBody = _unitofwork.BarBody.DetailsBarB(id);
        bodyTelegramaViewModel.TaBarBody.BarHeaderFk = _unitofwork.BarHeader.DetailsBarHB(id);

        ViewData["TelegramaId"] = HeaderTelegramaId;

        if (bodyTelegramaViewModel.TaBarBody == null)
        {
            return NotFound();
        }
        ViewData["NomImpactId"] = new SelectList(_unitofwork.NomImpact.GetAll(), "Id", "Nume");
        ViewData["NomAnulatId"] = new SelectList(_unitofwork.NomAnulat.GetAll(), "Id", "Nume");

        return View(bodyTelegramaViewModel);
    }


// POST
    public IActionResult Edit(int id, BodyTelegramaViewModel bodyTelegramaViewModel)
    {
        if (id != bodyTelegramaViewModel.TaBarBody.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                bodyTelegramaViewModel.TaBarBody.BarHeaderId = id;
                _unitofwork.BarBody.Update(bodyTelegramaViewModel.TaBarBody);
                _unitofwork.Save();
    }
            catch (DbUpdateConcurrencyException)
            {
                if (!TaBarBodyExists(bodyTelegramaViewModel.TaBarBody.Id))
                {
                    return NotFound();
}
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(bodyTelegramaViewModel);
    }

每次我编辑记录时,我的外键 - BarHeaderId - 将其值更改为 0。

我尝试了bodyTelegramaViewModel.TaBarBody.BarHeaderId = bodyTelegramaViewModel.TaBarHeader.Id;,但收到错误消息“对象引用未设置为对象的实例。”

如何获取TaBarHeader.Id 值并将其放入TaBarBody.BarHeaderId

更新

视图模型:

public class HeaderTelegramaViewModel
{
    public TaBarHeader TaBarHeader { get; set; }
    public IEnumerable<TaBarHeader> taBarHeader { get; set; }
    public TaBarBody TaBarBody { get; set; }
    public IEnumerable<TaBarBody> taBarBody { get; set; }
}

public class BodyTelegramaViewModel
{
    public TaBarBody TaBarBody { get; set; }
    public IEnumerable<TaBarBody> taBarBody { get; set; }
}

HeaderTelegramaController:

    public IActionResult Details(int id)
    {
        HeaderTelegramaViewModel headerTelegramaViewModel = new HeaderTelegramaViewModel();
        headerTelegramaViewModel.TaBarHeader = _unitofwork.BarHeaderRepository.DetailsBarHB(id);

        if (headerTelegramaViewModel == null)
        {
            return NotFound();
        }
        return View(headerTelegramaViewModel);
    }

BodyTelegramaController:

// GET
public IActionResult Edit(int id)
{
    BodyTelegramaViewModel bodyTelegramaViewModel = new BodyTelegramaViewModel();
    bodyTelegramaViewModel.TaBarBody = new TaBarBody();
    bodyTelegramaViewModel.TaBarBody.BarHeaderFk = new TaBarHeader();
    bodyTelegramaViewModel.TaBarBody = _unitofwork.BarBodyRepository.DetailsBarB(id);
    bodyTelegramaViewModel.TaBarBody.BarHeaderFk = _unitofwork.BarHeaderRepository.DetailsBarHB(id);
    return View(bodyTelegramaViewModel);
}

这些是DetailsBarB()DetailsBarHB()的方法:

    public TaBarBody DetailsBarB(int id)
    {
        return _db.TaBarBodies
            .Include(t => t.BarHeaderFk)
            .FirstOrDefault(m => m.Id == id);
    }

    public TaBarHeader DetailsBarHB(int id)
    {
        return _db.TaBarHeaders
        .Include(x => x.TaBarBodies).ThenInclude(x => x.BarHeaderFk.CategoriaFk)
        .FirstOrDefault(m => m.Id == id);
    }

【问题讨论】:

  • 请分享您的ViewModelHeaderTelegrama/Details 操作。
  • 我已经添加了要求的信息。

标签: entity-framework asp.net-core-mvc master-detail


【解决方案1】:

您可以进行以下更改以获得TaBarHeader id。

在您的Details View 中,将其更改为:

 <a asp-controller="BodyTelegrama" asp-action="Edit" asp-route-id="@item.Id" asp-route-HeaderTelegramaId="@Model.TaBarHeader.Id">Edit</a>

在您的 Edit 操作中,将其更改为:

public IActionResult Edit(int id,int HeaderTelegramaId)
{
    BodyTelegramaViewModel bodyTelegramaViewModel = new BodyTelegramaViewModel();
    bodyTelegramaViewModel.TaBarBody = new TaBarBody();
    bodyTelegramaViewModel.TaBarBody.BarHeaderFk = new TaBarHeader();
    bodyTelegramaViewModel.TaBarBody = _unitofwork.BarBodyRepository.DetailsBarB(id);
    bodyTelegramaViewModel.TaBarBody.BarHeaderFk = _unitofwork.BarHeaderRepository.DetailsBarHB(id);

    ViewData["TelegramaId"] = HeaderTelegramaId;

    return View(bodyTelegramaViewModel);
}
[HttpPost]
public IActionResult Edit(int id, BodyTelegramaViewModel bodyTelegramaViewModel)
{
 bodyTelegramaViewModel.TaBarBody.BarHeaderId = id;
 _unitofwork.BarBodyRepository.Update(bodyTelegramaViewModel.TaBarBody);
 _unitofwork.Save();
 return View(bodyTelegramaViewModel);
}

然后在您的Edit View 中,将其更改为:

<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>

<div class="form-group">
    <input type="hidden" asp-for="@Model.TaBarBody.Id" />
    <label asp-for="@Model.TaBarBody.Codstatie1" class="control-label">Cod Statie 1</label>
    <input asp-for="@Model.TaBarBody.Codstatie1" class="form-control" />
    <span asp-validation-for="@Model.TaBarBody.Codstatie1" class="text-danger"></span>
</div>
<div>
    <input type="submit" asp-route-id="@ViewBag.TelegramaId" value="Save"/>
</div>
</form>

然后在您的Edit 发布操作中,id 将是TaBarHeader.Id

测试结果:

【讨论】:

  • 我已经尝试了上面的代码并在编辑帖子操作中添加了bodyTelegramaViewModel.TaBarBody.BarHeaderId = id;,但是在我编辑了一条记录之后,即使用 Id 49 和 HeaderTelegramaId=6 我收到错误 404 找不到网址的网页:localhost:44313/BodyTelegrama/Edit/6
  • 我对代码进行了更改并从编辑视图中删除了&lt;input type="hidden" asp-for="@Model.TaBarBody.Id" /&gt;,但我得到了同样的错误 404。
  • 请分享您的整个BodyTelegrama/Edit.cshtml 代码。
  • 或者您可以尝试在帖子编辑操作中更改为return RedirectToAction("Index", "HeaderTelegrama");
  • 首先你需要确定的是你的表单已经成功提交到你的post edit action并且id成功获取了。可以断点观察
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多