发送到主视图时,ViewModel属性为NULL-Asp.Net Core MVC

时间:2019-09-15 22:32:20

标签: asp.net asp.net-core asp.net-core-mvc

我有一个ViewModel(FilialViewModel),它具有PessoaViewModel类型的属性。主视图与FilialViewModel绑定,并且每当我提交时,PessoaViewModel类型的属性为NULL。这是因为当我调用PartialView Person时,我传递了FilialViewModel.PersonaViewModel ...提交时,仅加载了FilialViewModel ...的字段。有人知道如何解决这个问题吗?

public class FilialViewModel
{
    [Key]
    public int PessoaFilialId { get; set; }

    [DisplayName("Tipo de Filial")]
    [Required(ErrorMessage = "Escolha um Tipo de Filial")]
    public FilialTipo FilialTipo { get; set; }

    public PessoaViewModel PessoaViewModel { get; set; }

}

public class PessoaViewModel
{
    [Key]
    public int Id { get; set; }

    [DisplayName("Natureza")]
    [Required(ErrorMessage = "Escolha uma Natureza")]
    public PessoaNatureza PessoaNatureza { get; set; }
    [DisplayName("Natureza")]
}

查看孝顺:

@model Retaguarda.Application.ViewModels.Filial.FilialViewModel
@{

}

<div class="panel">
    <div class="panel-body container-fluid pt-5 pl-15 pr-15">
        <div class="form-horizontal">
            <vc:summary />
           @await Html.PartialAsync("~/Views/Pessoa/_Pessoa.cshtml", Model.PessoaViewModel)
        </div>
    </div>
</div>

查看佩索阿:

@model Retaguarda.Application.ViewModels.Pessoa.PessoaViewModel
@using Retaguarda.Domain.Enuns.Pessoa
@{
    ViewData["Title"] = "Pessoa";
}

@Html.HiddenFor(model => model.Id, new { @class = "hidden-id" })
<div class="col-md-2">
    <label asp-for="PessoaNatureza" class="control-label">Natureza</label>
    <select id="pessoaNatureza" data-modal="" asp-for="PessoaNatureza" asp-items="Model.PessoasNaturezas" title="Selecione uma opção" class="form-control"><option value=""></option></select>
    <span asp-validation-for="PessoaNatureza" class="text-danger"></span>
</div>

控制器:

[HttpPost]
[Authorize(Policy = "CanWriteFilialData")]
[Route("filial-gerenciar/cadastrar-novo")]
[ValidateAntiForgeryToken]
public IActionResult Create(FilialViewModel filialViewModel)
{
    if (!ModelState.IsValid) return View(filialViewModel);
    _filialAppService.Register(filialViewModel);

    if (IsValidOperation())
        ViewBag.Sucesso = "Filial cadastrada!";
    // return Json(new { success = true, message = "Pessoa Excuída!" });
    return View(filialViewModel);

}

enter image description here

1 个答案:

答案 0 :(得分:0)

对于您的问题,您需要通过FilialViewModel而不是PessoaViewModel

请按照以下步骤操作:

  1. 模型

    public class FilialViewModel
    {
        [Key]
        public int PessoaFilialId { get; set; }
    
        public PessoaViewModel PessoaViewModel { get; set; }
    
    }
    
    public class PessoaViewModel
    {
        [Key]
        public int Id { get; set; }
    
        [DisplayName("Natureza")]
        [Required(ErrorMessage = "Escolha uma Natureza")]
        public string PessoaNatureza { get; set; }
        public List<SelectListItem> PessoasNaturezas { get; set; }
    }
    
  2. 查看

    @model FilialViewModel
    @{
    
    }
    <div class="panel">
        <form method="post">
            <div class="panel-body container-fluid pt-5 pl-15 pr-15">
                <div class="form-horizontal">
                    @await Html.PartialAsync("~/Views/Pessoa/_Pessoa.cshtml", Model)
                </div>
            </div>
            <input type="submit" value="Submit"/>
        </form>
    
    </div>
    
  3. 部分视图

    @model FilialViewModel
    
    @{
        ViewData["Title"] = "Pessoa";
    }
    
    @Html.HiddenFor(model => model.PessoaViewModel.Id, new { @class = "hidden-id" })
    <div class="col-md-2">
        <label asp-for="PessoaViewModel.PessoaNatureza" class="control-label">Natureza</label>
        <select id="pessoaNatureza" data-modal="" asp-for="@Model.PessoaViewModel.PessoaNatureza" asp-items="@Model.PessoaViewModel.PessoasNaturezas" title="Selecione uma opção" class="form-control"><option value=""></option></select>
        <span asp-validation-for="@Model.PessoaViewModel.PessoaNatureza" class="text-danger"></span>
    </div>
    

请注意,对于PessoaNatureza,您需要定义接受字段而不是像PessoaNatureza这样的对象的属性。