将导航属性另存为空

时间:2019-11-15 22:46:32

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

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

  1. StatusOnHold为空时,我试图在StatusOnHoldId模型的Job中接收 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>

2 个答案:

答案 0 :(得分:0)

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

所以添加

public int StatusOnHoldViewModelId { get; set; }

到您的 JobViewModel

答案 1 :(得分:0)

StatusOnHoldId不会为空,并且总是有数据,如果您不在textarea中写笔记,它将看起来像{ "id":0,"note":null}在jobViewModel`上起作用,这将创建一个新记录。

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

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();
}