asp.net-core
Просмотреть компоненты
Поиск…
Создание компонента просмотра
Просмотреть компоненты инкапсулируют многоразовые фрагменты логики и представлений. Они определяются:
- Класс ViewComponent, содержащий логику для извлечения и подготовки данных для представления и определения вида представления.
- Один или несколько просмотров
Поскольку они содержат логику, они более гибкие, чем частичные, хотя и способствуют хорошему разделению проблем.
Простой пользовательский компонент представления определяется как:
public class MyCustomViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(string param1, int param2)
{
//some business logic
//renders ~/Views/Shared/Components/MyCustom/Default.cshtml
return View(new MyCustomModel{ ... });
}
}
@*View file located in ~/Views/Shared/Components/MyCustom/Default.cshtml*@
@model WebApplication1.Models.MyCustomModel
<p>Hello @Model.UserName!</p>
Они могут быть вызваны из любого представления (или даже контроллера, возвращая ViewComponentResult
)
@await Component.InvokeAsync("MyCustom", new {param1 = "foo", param2 = 42})
Вход в систему
Шаблон проекта по умолчанию создает частичный вид _LoginPartial.cshtml, который содержит немного логики для определения того, вошел ли пользователь в систему или нет, и узнайте его имя пользователя.
Поскольку компонент представления может быть лучше подходит (поскольку в нем задействована логика и даже 2 приложения), в следующем примере показано, как преобразовать элемент LoginPartial в компонент представления.
Просмотр класса компонентов
public class LoginViewComponent : ViewComponent
{
private readonly SignInManager<ApplicationUser> signInManager;
private readonly UserManager<ApplicationUser> userManager;
public LoginViewComponent(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
{
this.signInManager = signInManager;
this.userManager = userManager;
}
public async Task<IViewComponentResult> InvokeAsync()
{
if (signInManager.IsSignedIn(this.User as ClaimsPrincipal))
{
return View("SignedIn", await userManager.GetUserAsync(this.User as ClaimsPrincipal));
}
return View("SignedOut");
}
}
Вход в SignedIn (в ~ / Views / Shared / Components / Login / SignedIn.cshtml)
@model WebApplication1.Models.ApplicationUser
<form asp-area="" asp-controller="Account" asp-action="LogOff" method="post" id="logoutForm" class="navbar-right">
<ul class="nav navbar-nav navbar-right">
<li>
<a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @Model.UserName!</a>
</li>
<li>
<button type="submit" class="btn btn-link navbar-btn navbar-link">Log off</button>
</li>
</ul>
</form>
SignedOut view (в ~ / Views / Shared / Components / Login / SignedOut.cshtml)
<ul class="nav navbar-nav navbar-right">
<li><a asp-area="" asp-controller="Account" asp-action="Register">Register</a></li>
<li><a asp-area="" asp-controller="Account" asp-action="Login">Log in</a></li>
</ul>
Вызов из _Layout.cshtml
@await Component.InvokeAsync("Login")
Возврат из действия контроллера
При наследовании от базового класса Controller
предоставляемого каркасом, вы можете использовать метод ViewComponent()
для возврата компонента вида из действия:
public IActionResult GetMyComponent()
{
return ViewComponent("Login", new { param1 = "foo", param2 = 42 });
}
Если вы используете класс POCO в качестве контроллера, вы можете вручную создать экземпляр класса ViewComponentResult
. Это будет эквивалентно приведенному выше коду:
public IActionResult GetMyComponent()
{
return new ViewComponentResult
{
ViewComponentName = "Login",
Arguments = new { param1 = "foo", param2 = 42 }
};
}