【问题标题】:Save navigation property as null将导航属性保存为空
【发布时间】:2019-11-15 22:46:32
【问题描述】:

我有一个Job 模型和StatusOnHold 模型。 我在Job 模型中添加了导航属性StatusOnHold。 出于某种原因,当我用空的StatusOnHold 保存Job 模型时,我仍然在Job 模型中的StatusOnHoldId 中获得价值。

  1. StatusOnHold 为空时,我试图在Job 模型中的StatusOnHoldId 中接收NULL 值。
  2. StatusOnHold 不为空时,我尝试获取StatusOnHoldId 并将值保存在StatusOnHold 模型中(现在它的工作方式就是这样)。

非常感谢。

这是我的模型...

public class StatusOnHoldViewModel
{
    public int Id { get; set; }
    public string Note { get; set; }
}

public class JobViewModel
{
    [Key]
    public int Id { get; set; }
    public string JobNote { get; set; }
    public JobStatus JobStatus { get; set; }
    public CompanyViewModel Company { get; set; }
    public CustomerViewModel Customer { get; set; }

    public StatusOnHoldViewModel StatusOnHold { get; set; }
}

这里是控制器...

    public async Task<IActionResult> Create(JobViewModel jobViewModel)
    {
        if (ModelState.IsValid)
        {
            var job = _mapper.Map<Job>(jobViewModel);
            var newjobId = await _jobRepository.AddAsync(job);

            return RedirectToAction("details", new { id = newjobId });
        }
        return View();
    }

这里是视图...

<div class="form-group row">
    <label class="col-sm-2 col-form-label"></label>
    <div class="col-sm-10">
        <div class="m-1">On-Hold</div>
        <textarea asp-for="StatusOnHold.Note" style="height:86px; min-height:86px" class="form-control" placeholder="Reason..."></textarea>
        <span asp-validation-for="StatusOnHold.Note" class="text-danger"></span>
    </div>
</div>

【问题讨论】:

  • I'm still getting value in the StatusOnHoldId in the Job model.你在数据库中得到了什么值?
  • 在数据库中,我得到,StatusOnHoldId 与 StatusOnHold 中的 Id 相同(这是有道理的)。但我试图传递 NULL。对于 Job 中的 StatusOnHoldId 和 StatusOnHold 中的 Id

标签: asp.net-core model-view-controller


【解决方案1】:

您没有 StatusOnHoldViewModel 的属性,仅导航属性将不起作用。

所以添加

public int StatusOnHoldViewModelId { get; set; }

到你的 JobViewModel

【讨论】:

  • 我尝试像这样添加它public int? StatusOnHoldViewModelId { get; set; } 但它没有用。
  • 那我觉得你需要像[ForeignKey("StatusOnHoldViewModel")]一样使用ForeignKeyAttribute。我没有检查,所以也许我错了。请查看文档。
  • 对了,你为什么把这些类命名为 ViewModel?视图模型通常用于展示而不是用于业务层。他们为 UI(视图)提供数据
  • 我只是试图添加 ForeignKeyAttribute 但它没有让我。它说“实体类型'Job'上已经存在同名的属性或导航”。
  • 我想问题是......当我将信息从视图传递给控制器​​时,即使我没有发送任何值(在 StatusOnHold )
【解决方案2】:

StatusOnHoldId 不会为空,它总是有数据,如果你不在 textarea 中写注释,它看起来像{ "id":0,"note":null} on action for jobViewModel`,这将创建一个新记录。

一种解决方法是,当note 为空时,您可以将StatusOnHold 设置为空:

public async Task<IActionResult> Create(JobViewModel jobViewModel)
{
    if (ModelState.IsValid)
    {
        if(jobViewModel.StatusOnHold.Note == null)
        {
            jobViewModel.StatusOnHold = null;
        }

        var job = _mapper.Map<Job>(jobViewModel);
        var newjobId = await _jobRepository.AddAsync(job);

        return RedirectToAction("details", new { id = newjobId });
    }
    return View();
}

【讨论】:

  • 抱歉拖了这么久。它确实解决了大部分问题,对此我谢谢。但是,如果我有更多的属性,而不仅仅是Note? (我在StatusOnHold 中有多个属性)。再次感谢您
  • @Noah 您可以使用|| 将其他属性附加到jobViewModel.StatusOnHold.Note == null。或者您可以查看automapper conditional mapping
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多