【问题标题】:Why are the PartialView models null in a PostBack to an Asp.Net Core Razor main page view's controller?为什么 PartialView 模型在回发到 Asp.Net Core Razor 主页视图的控制器中为空?
【发布时间】:2021-07-28 05:59:43
【问题描述】:

我有一个包含多个部分视图的 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) 的定义上?

【问题讨论】:

    标签: c# asp.net-core razor


    【解决方案1】:

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

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

    我们来看代码:

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

    partial 标记上的 model 属性的作用是将该模型的实例传递给局部视图。

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

    改成这样:

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

    【讨论】:

    • 除了一个小点之外,你是正确的。在标签助手中包含“for”和“model”会在部分视图加载时引发运行时错误。显然,您的定义中只能有“for”或“model”。谢谢你让我指出来。
    • 感谢@JohnB 指出该错误。很高兴你解决了这个问题,我已经更新了帖子
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多