繁体   English   中英

为什么 PartialView 模型在 PostBack 到 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 Core Razor 页面。 在返回主页控制器的帖子中,我的部分视图模型为空值。

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

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

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(s) 的定义上?

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

局部视图可以是父窗体的一部分,但局部视图不知道父模型。

让我们看一下代码:

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

局部标签上的模型属性所做的就是将模型的一个实例传递给局部视图。

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

像这样改变它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM