将模型传递给 PartialAsync 视图(Razor、MVC)
Pass model to PartialAsync view (Razor, MVC)
我 AccountController.cs 执行以下操作:
[HttpGet]
[AllowAnonymous]
public IActionResult Register()
{
ViewBag.Registration = GetRegistration();
return View();
}
ViewBag.Registration包含2个元素,没问题
然后我得到了Registration.cshtml视图:
@model Registration <!-- this model I'm using for other form -->
@{
Layout = "_Layout";
}
<!-- some code -->
@await Html.PartialAsync("AllRegistered")
和AllRegistered.cshtml,其中应显示来自ViewBag.Registration的数据:
@model IEnumerable<Registration>
<table>
<tr>
<th>@Html.DisplayNameFor(m => m.Email)</th>
<th>@Html.DisplayNameFor(m => m.City)</th>
</tr>
@if (Model != null && Model.Count() != 0)
{
@foreach (Registration registration in Model)
{
<tr>
<th>@Html.DisplayFor(m => registration.Email)</th>
<th>@Html.DisplayFor(m => registration.City)</th>
</tr>
}
}
</table>
但是没有生成任何东西进入视图,我认为模型是空的。
PartialAsync 方法包含一个包含模型的重载:
Html.PartialAsync(string partialViewName, TModel model)
您应该在该助手中包含 IEnumerable<Registration>
(局部视图的模型)。
如果 GetRegistrations() 返回 IEnumerable,您可以像这样定义分部视图:
@await Html.PartialAsync("AllRegistered", (List<Registration>)ViewBag.Registration)
虽然 Nathan 的回答完全正确,但将其作为视图组件更为合适。您想要显示所有注册的事实是一个视图详细信息,与此操作的目的无关。因此,让操作负责检索数据需要它拥有它不需要也不应该拥有的知识。
相反,添加一个 class 如:
public class AllRegistrationsViewComponent : ViewComponent
{
private readonly RegistrationsService _service;
public AllRegistrationsViewComponent(RegistrationService service)
{
_service = service;
}
public async Task<IViewComponentResult> InvokeAsync()
{
// logic behind `GetRegistrations()` here
return View(registrations);
}
}
此处对 RegistrationsService
的引用只是您用来检索注册的任何方式,以展示如何将其注入组件。这可能是您的背景或完全不同的东西。
然后,创建视图 Views/Components/AllRegistrations/Default.cshtml
:
@model IEnumerable<Registration>
<table>
<tr>
<th>@Html.DisplayNameFor(m => m.Email)</th>
<th>@Html.DisplayNameFor(m => m.City)</th>
</tr>
@if (Model != null && Model.Count() != 0)
{
@foreach (Registration registration in Model)
{
<tr>
<th>@Html.DisplayFor(m => registration.Email)</th>
<th>@Html.DisplayFor(m => registration.City)</th>
</tr>
}
}
</table>
路径的AllRegistrations
部分是基于视图组件的名称,没有ViewComponent
部分,所以如果你命名不同,也在这里调整。
最后,在您看来:
@await Component.InvokeAsync("AllRegistrations")
那么,你的行动就可以专注于它的实际目的:
[HttpGet]
[AllowAnonymous]
public IActionResult Register()
{
return View();
}
我 AccountController.cs 执行以下操作:
[HttpGet]
[AllowAnonymous]
public IActionResult Register()
{
ViewBag.Registration = GetRegistration();
return View();
}
ViewBag.Registration包含2个元素,没问题
然后我得到了Registration.cshtml视图:
@model Registration <!-- this model I'm using for other form -->
@{
Layout = "_Layout";
}
<!-- some code -->
@await Html.PartialAsync("AllRegistered")
和AllRegistered.cshtml,其中应显示来自ViewBag.Registration的数据:
@model IEnumerable<Registration>
<table>
<tr>
<th>@Html.DisplayNameFor(m => m.Email)</th>
<th>@Html.DisplayNameFor(m => m.City)</th>
</tr>
@if (Model != null && Model.Count() != 0)
{
@foreach (Registration registration in Model)
{
<tr>
<th>@Html.DisplayFor(m => registration.Email)</th>
<th>@Html.DisplayFor(m => registration.City)</th>
</tr>
}
}
</table>
但是没有生成任何东西进入视图,我认为模型是空的。
PartialAsync 方法包含一个包含模型的重载:
Html.PartialAsync(string partialViewName, TModel model)
您应该在该助手中包含 IEnumerable<Registration>
(局部视图的模型)。
如果 GetRegistrations() 返回 IEnumerable,您可以像这样定义分部视图:
@await Html.PartialAsync("AllRegistered", (List<Registration>)ViewBag.Registration)
虽然 Nathan 的回答完全正确,但将其作为视图组件更为合适。您想要显示所有注册的事实是一个视图详细信息,与此操作的目的无关。因此,让操作负责检索数据需要它拥有它不需要也不应该拥有的知识。
相反,添加一个 class 如:
public class AllRegistrationsViewComponent : ViewComponent
{
private readonly RegistrationsService _service;
public AllRegistrationsViewComponent(RegistrationService service)
{
_service = service;
}
public async Task<IViewComponentResult> InvokeAsync()
{
// logic behind `GetRegistrations()` here
return View(registrations);
}
}
此处对 RegistrationsService
的引用只是您用来检索注册的任何方式,以展示如何将其注入组件。这可能是您的背景或完全不同的东西。
然后,创建视图 Views/Components/AllRegistrations/Default.cshtml
:
@model IEnumerable<Registration>
<table>
<tr>
<th>@Html.DisplayNameFor(m => m.Email)</th>
<th>@Html.DisplayNameFor(m => m.City)</th>
</tr>
@if (Model != null && Model.Count() != 0)
{
@foreach (Registration registration in Model)
{
<tr>
<th>@Html.DisplayFor(m => registration.Email)</th>
<th>@Html.DisplayFor(m => registration.City)</th>
</tr>
}
}
</table>
路径的AllRegistrations
部分是基于视图组件的名称,没有ViewComponent
部分,所以如果你命名不同,也在这里调整。
最后,在您看来:
@await Component.InvokeAsync("AllRegistrations")
那么,你的行动就可以专注于它的实际目的:
[HttpGet]
[AllowAnonymous]
public IActionResult Register()
{
return View();
}