为什么 PartialView 模型在回发到 Asp.Net Core Razor 主页视图的控制器时为空?

Why are the PartialView models null in a PostBack to an Asp.Net Core Razor main page view's controller?

我有一个 Asp.Net 核心 Razor 页面,其中包含多个局部视图。 在 post 返回主页面控制器时,我的局部视图模型出现空值。

我如何确保这些被正确填充并作为主视图模型的一部分发送 到我的控制器?

下面是一个简化的例子。 这是我的模型定义:

public class MainPageViewModel
{
    public string DocumentName { get; set; }
    public string DocumentNumber { get; set; }
    public string ViewName { get; set; }
    public PartialSampleViewModel PartialSampleModel { get; set; }

}

public class PartialSampleViewModel
{
    public DateTime DetailsDate { get; set; }
    public String DetailsDescription { get; set; }
}

这是我的控制器定义:

public class MainPageController : Controller
{
    public async Task<IActionResult> Index()
    {
        var viewModel = new MainPageViewModel()
        {
            DocumentName = "Foo",
            DocumentNumber = "1",
            PartialSampleModel = new PartialSampleViewModel()
            {
                DetalsDate = DateTime.Now,
                DetailsDescription = "Description"
            }
        };

        return View(viewModel);
    }

    [HttpPost]
    public async Task<IActionResult> SaveDocument(MainPageViewModel mainPageViewModel)
    {
        // mainPageViewModel.PartialSampleModel is null.
    }
}

这是我的主页定义:

@model MainPageViewModel

<form method="post" action="SaveDocument" >
    <div id="InputFormPanel" class="InputFormPanel">
        <partial name="@Model.ViewName" model="@Model.PartialSampleModel" />
    </div>
        
    <div class="col-md-2">
        <label asp-for="DocumentName">Document Name:</label>
    </div>
    <div class="col-md-4">
        <input class="form-control" asp-for="DocumentName" />
        <span asp-validation-for="DocumentName" class="text-danger"></span>
    </div>
    <div class="col-md-1">
        <label asp-for="DocumentNumber">Number:</label>
    </div>
    <div class="col-md-2">
        <input class="form-control" asp-for="DocumentNumber" />
    </div>  

    <!-- A bunch more common fields on main page -->
    <div class="text-center panel-body">
        <button id="SaveButton" class="btn btn-sm btn-primary ApproveDocument" >Save Form</button>
    </div>  
</form>

这是我的局部视图定义:

@model PartialSampleModelRecord

<div class="row">
    <div class="col-md-6">
        <label asp-for="DetailsDate">Date:: </label></td>
    </div>
    <div class="col-md-6">
        <input class="form-control" asp-for="DetailsDate" />
    </div>
</div>
<div class="row">
    <div class="col-md-6">
        <label asp-for="DetailsDescription">Description:</label>
    </div>
    <div class="col-md-6">
        <input class="form-control" asp-for="DetailsDescription" />
    </div>
</div>
<!-- A bunch more other fields -->

问题出在我的模型定义上还是出在我的 PartialView 的定义上?

问题在于没有在局部视图上使用 for 属性。我会尽力解释原因。

分部视图可以成为父表单的一部分,但分部视图不知道父模型。

我们来看代码:

<partial name="@Model.ViewName" model="@Model.PartialSampleModel" />

部分标签上的模型属性的作用是将该模型的实例传递给部分视图。

在表单中,提交表单时仅发布具有 (asp-) 'for' 标记的输入。在上面的示例中,您明确表示部分视图不是 'for' 父模型,它可能包含的任何输入都将被忽略。您需要告诉表单:嘿,这个部分视图是 对于 我们的模型,确保它包含的任何值都保留在我们的模型中。

改成这样:

<partial name="@Model.ViewName" for="PartialSampleModel" />