为什么 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" />
我有一个 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" />