ASP.NET Core'daki görünümlere bağımlılık ekleme
ASP.NET Core, görünümlere bağımlılık eklemeyi destekler. Bu, yerelleştirme veya yalnızca görünüm öğelerinin doldurulması için gereken veriler gibi görünüme özgü hizmetler için yararlı olabilir. Veri görünümlerinin çoğu denetleyiciden geçirilmelidir.
Örnek kodu görüntüleme veya indirme (indirme)
Yapılandırma ekleme
ve appsettings.Development.json
gibi appsettings.json
ayarlar dosyalarındaki değerler bir görünüme eklenebilir. Örnek koddan değerini appsettings.Development.json
göz önünde bulundurun:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"MyRoot": {
"MyParent": {
"MyChildName": "Joe"
}
}
}
Aşağıdaki işaretleme, yapılandırma değerini Sayfalar Razor görünümünde görüntüler:
@page
@model PrivacyModel
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@{
ViewData["Title"] = "Privacy RP";
}
<h1>@ViewData["Title"]</h1>
<p>PR Privacy</p>
<h2>
MyRoot:MyParent:MyChildName: @Configuration["MyRoot:MyParent:MyChildName"]
</h2>
Aşağıdaki işaretleme, MVC görünümünde yapılandırma değerini görüntüler:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@{
ViewData["Title"] = "Privacy MVC";
}
<h1>@ViewData["Title"]</h1>
<p>MVC Use this page to detail your site's privacy policy.</p>
<h2>
MyRoot:MyParent:MyChildName: @Configuration["MyRoot:MyParent:MyChildName"]
</h2>
Daha fazla bilgi için bkz . ASP.NET Core'da yapılandırma
Hizmet ekleme
Bir hizmet, yönergesi kullanılarak bir görünüme @inject
eklenebilir.
@using System.Threading.Tasks
@using ViewInjectSample.Model
@using ViewInjectSample.Model.Services
@model IEnumerable<ToDoItem>
@inject StatisticsService StatsService
<!DOCTYPE html>
<html>
<head>
<title>To Do Items</title>
</head>
<body>
<div>
<h1>To Do Items</h1>
<ul>
<li>Total Items: @StatsService.GetCount()</li>
<li>Completed: @StatsService.GetCompletedCount()</li>
<li>Avg. Priority: @StatsService.GetAveragePriority()</li>
</ul>
<table>
<tr>
<th>Name</th>
<th>Priority</th>
<th>Is Done?</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Priority</td>
<td>@item.IsDone</td>
</tr>
}
</table>
</div>
</body>
</html>
Bu görünümde örneklerin ToDoItem
listesi ve genel istatistikleri gösteren bir özet görüntülenir. Özet, eklenen StatisticsService
dosyasından doldurulur. Bu hizmet içinde bağımlılık ekleme ConfigureServices
Program.cs
için kaydedilir:
using ViewInjectSample.Helpers;
using ViewInjectSample.Infrastructure;
using ViewInjectSample.Interfaces;
using ViewInjectSample.Model.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
builder.Services.AddTransient<IToDoItemRepository, ToDoItemRepository>();
builder.Services.AddTransient<StatisticsService>();
builder.Services.AddTransient<ProfileOptionsService>();
builder.Services.AddTransient<MyHtmlHelper>();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.Run();
, StatisticsService
bir depo aracılığıyla eriştiği örnek kümesinde ToDoItem
bazı hesaplamalar yapar:
using System.Linq;
using ViewInjectSample.Interfaces;
namespace ViewInjectSample.Model.Services
{
public class StatisticsService
{
private readonly IToDoItemRepository _toDoItemRepository;
public StatisticsService(IToDoItemRepository toDoItemRepository)
{
_toDoItemRepository = toDoItemRepository;
}
public int GetCount()
{
return _toDoItemRepository.List().Count();
}
public int GetCompletedCount()
{
return _toDoItemRepository.List().Count(x => x.IsDone);
}
public double GetAveragePriority()
{
if (_toDoItemRepository.List().Count() == 0)
{
return 0.0;
}
return _toDoItemRepository.List().Average(x => x.Priority);
}
}
}
Örnek depo, bellek içi bir koleksiyon kullanır. Bellek içi uygulama, büyük, uzaktan erişilen veri kümeleri için kullanılmamalıdır.
Örnek, görünüme bağlı modelden verileri ve görünüme eklenen hizmeti görüntüler:
Arama Verilerini Doldurma
Görüntüleme ekleme, açılan listeler gibi kullanıcı arabirimi öğelerindeki seçenekleri doldurmak için yararlı olabilir. Cinsiyet, durum ve diğer tercihleri belirtme seçeneklerini içeren bir kullanıcı profili formu düşünün. Standart bir yaklaşım kullanarak böyle bir formun işlenmesi için denetleyicinin veya Razor Sayfanın şunları yapmaları gerekebilir:
- Seçenek kümelerinin her biri için veri erişim hizmetleri isteyin.
- Bir modeli veya
ViewBag
bağlanılacak her seçenek kümesiyle doldurun.
Alternatif bir yaklaşım, seçenekleri elde etmek için hizmetleri doğrudan görünüme ekler. Bu, denetleyici veya razor Sayfa için gereken kod miktarını en aza indirerek bu görünüm öğesi oluşturma mantığını görünümün kendisine taşır. Profil düzenleme formunu görüntülemek için denetleyici eyleminin veya Razor Sayfa'nın yalnızca forma profil örneğini geçirmesi gerekir:
using Microsoft.AspNetCore.Mvc;
using ViewInjectSample.Model;
namespace ViewInjectSample.Controllers;
public class ProfileController : Controller
{
public IActionResult Index()
{
// A real app would up profile based on the user.
var profile = new Profile()
{
Name = "Rick",
FavColor = "Blue",
Gender = "Male",
State = new State("Ohio","OH")
};
return View(profile);
}
}
Tercihleri güncelleştirmek için kullanılan HTML formu, üç özelliğin açılan listelerini içerir:
Bu listeler, görünüme eklenmiş bir hizmet tarafından doldurulur:
@using System.Threading.Tasks
@using ViewInjectSample.Model.Services
@model ViewInjectSample.Model.Profile
@inject ProfileOptionsService Options
<!DOCTYPE html>
<html>
<head>
<title>Update Profile</title>
</head>
<body>
<div>
<h1>Update Profile</h1>
Name: @Html.TextBoxFor(m => m.Name)
<br/>
Gender: @Html.DropDownList("Gender",
Options.ListGenders().Select(g =>
new SelectListItem() { Text = g, Value = g }))
<br/>
State: @Html.DropDownListFor(m => m.State!.Code,
Options.ListStates().Select(s =>
new SelectListItem() { Text = s.Name, Value = s.Code}))
<br />
Fav. Color: @Html.DropDownList("FavColor",
Options.ListColors().Select(c =>
new SelectListItem() { Text = c, Value = c }))
</div>
</body>
</html>
ProfileOptionsService
, yalnızca bu form için gereken verileri sağlamak üzere tasarlanmış kullanıcı arabirimi düzeyinde bir hizmettir:
namespace ViewInjectSample.Model.Services;
public class ProfileOptionsService
{
public List<string> ListGenders()
{
// Basic sample
return new List<string>() {"Female", "Male"};
}
public List<State> ListStates()
{
// Add a few states
return new List<State>()
{
new State("Alabama", "AL"),
new State("Alaska", "AK"),
new State("Ohio", "OH")
};
}
public List<string> ListColors()
{
return new List<string>() { "Blue","Green","Red","Yellow" };
}
}
Hizmet sağlayıcısı aracılığıyla GetRequiredServicedahili olarak sorgulandığından, kaydedilmemiş bir türün çalışma zamanında bir özel durum oluştur olduğuna dikkat edin.
Hizmetleri Geçersiz Kılma
Bu teknik, yeni hizmetler eklemeye ek olarak bir sayfaya önceden eklenen hizmetleri geçersiz kılmak için de kullanılabilir. Aşağıdaki şekilde, ilk örnekte kullanılan sayfada bulunan tüm alanlar gösterilmektedir:
Varsayılan alanlar , Component
ve Url
alanlarını içerirHtml
. Varsayılan HTML Yardımcılarını özel bir sürümle değiştirmek için kullanın @inject
:
@using System.Threading.Tasks
@using ViewInjectSample.Helpers
@inject MyHtmlHelper Html
<!DOCTYPE html>
<html>
<head>
<title>My Helper</title>
</head>
<body>
<div>
Test: @Html.Value
</div>
</body>
</html>
Ayrıca bkz:
- Simon Timms Blogu: Arama Verilerini Görünümünüzde Alma
ASP.NET Core, görünümlere bağımlılık eklemeyi destekler. Bu, yerelleştirme veya yalnızca görünüm öğelerinin doldurulması için gereken veriler gibi görünüme özgü hizmetler için yararlı olabilir. Denetleyicileriniz ve görünümleriniz arasındaki endişelerin ayrımını sürdürmeye çalışmanız gerekir. Görünümlerinizin görüntülendiği verilerin çoğu denetleyiciden geçirilmelidir.
Örnek kodu görüntüleme veya indirme (indirme)
Yapılandırma ekleme
appsettings.json
değerleri doğrudan görünüme eklenebilir.
Dosya örneği appsettings.json
:
{
"root": {
"parent": {
"child": "myvalue"
}
}
}
için @inject
söz dizimi: @inject <type> <name>
kullanan @inject
bir örnek:
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@{
string myValue = Configuration["root:parent:child"];
...
}
Hizmet ekleme
Bir hizmet, yönergesi kullanılarak bir görünüme @inject
eklenebilir. Görünüme @inject
özellik ekleme ve DI kullanarak özelliği doldurma olarak düşünebilirsiniz.
@using System.Threading.Tasks
@using ViewInjectSample.Model
@using ViewInjectSample.Model.Services
@model IEnumerable<ToDoItem>
@inject StatisticsService StatsService
<!DOCTYPE html>
<html>
<head>
<title>To Do Items</title>
</head>
<body>
<div>
<h1>To Do Items</h1>
<ul>
<li>Total Items: @StatsService.GetCount()</li>
<li>Completed: @StatsService.GetCompletedCount()</li>
<li>Avg. Priority: @StatsService.GetAveragePriority()</li>
</ul>
<table>
<tr>
<th>Name</th>
<th>Priority</th>
<th>Is Done?</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Priority</td>
<td>@item.IsDone</td>
</tr>
}
</table>
</div>
</body>
</html>
Bu görünümde örneklerin ToDoItem
listesi ve genel istatistikleri gösteren bir özet görüntülenir. Özet, eklenen StatisticsService
dosyasından doldurulur. Bu hizmet içinde bağımlılık ekleme ConfigureServices
Startup.cs
için kaydedilir:
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
, StatisticsService
bir depo aracılığıyla eriştiği örnek kümesinde ToDoItem
bazı hesaplamalar yapar:
using System.Linq;
using ViewInjectSample.Interfaces;
namespace ViewInjectSample.Model.Services
{
public class StatisticsService
{
private readonly IToDoItemRepository _toDoItemRepository;
public StatisticsService(IToDoItemRepository toDoItemRepository)
{
_toDoItemRepository = toDoItemRepository;
}
public int GetCount()
{
return _toDoItemRepository.List().Count();
}
public int GetCompletedCount()
{
return _toDoItemRepository.List().Count(x => x.IsDone);
}
public double GetAveragePriority()
{
if (_toDoItemRepository.List().Count() == 0)
{
return 0.0;
}
return _toDoItemRepository.List().Average(x => x.Priority);
}
}
}
Örnek depo, bellek içi bir koleksiyon kullanır. Yukarıda gösterilen uygulama (bellekteki tüm veriler üzerinde çalışır) büyük, uzaktan erişilen veri kümeleri için önerilmez.
Örnek, görünüme bağlı modelden verileri ve görünüme eklenen hizmeti görüntüler:
Arama Verilerini Doldurma
Görüntüleme ekleme, açılan listeler gibi kullanıcı arabirimi öğelerindeki seçenekleri doldurmak için yararlı olabilir. Cinsiyet, durum ve diğer tercihleri belirtme seçeneklerini içeren bir kullanıcı profili formu düşünün. Standart bir MVC yaklaşımı kullanarak böyle bir formun işlenmesi, denetleyicinin bu seçenek kümelerinin her biri için veri erişim hizmetleri istemesini ve ardından bir modeli veya ViewBag
bağlanılacak her seçenek kümesiyle doldurmasını gerektirir.
Alternatif bir yaklaşım, seçenekleri elde etmek için hizmetleri doğrudan görünüme ekler. Bu, denetleyicinin gerektirdiği kod miktarını en aza indirir ve bu görünüm öğesi oluşturma mantığını görünümün kendisine taşır. Profil düzenleme formunu görüntülemek için denetleyici eyleminin yalnızca formu profil örneğinden geçirmesi gerekir:
using Microsoft.AspNetCore.Mvc;
using ViewInjectSample.Model;
namespace ViewInjectSample.Controllers
{
public class ProfileController : Controller
{
[Route("Profile")]
public IActionResult Index()
{
// TODO: look up profile based on logged-in user
var profile = new Profile()
{
Name = "Steve",
FavColor = "Blue",
Gender = "Male",
State = new State("Ohio","OH")
};
return View(profile);
}
}
}
Bu tercihleri güncelleştirmek için kullanılan HTML formu, üç özelliğin açılan listelerini içerir:
Bu listeler, görünüme eklenmiş bir hizmet tarafından doldurulur:
@using System.Threading.Tasks
@using ViewInjectSample.Model.Services
@model ViewInjectSample.Model.Profile
@inject ProfileOptionsService Options
<!DOCTYPE html>
<html>
<head>
<title>Update Profile</title>
</head>
<body>
<div>
<h1>Update Profile</h1>
Name: @Html.TextBoxFor(m => m.Name)
<br/>
Gender: @Html.DropDownList("Gender",
Options.ListGenders().Select(g =>
new SelectListItem() { Text = g, Value = g }))
<br/>
State: @Html.DropDownListFor(m => m.State.Code,
Options.ListStates().Select(s =>
new SelectListItem() { Text = s.Name, Value = s.Code}))
<br />
Fav. Color: @Html.DropDownList("FavColor",
Options.ListColors().Select(c =>
new SelectListItem() { Text = c, Value = c }))
</div>
</body>
</html>
ProfileOptionsService
, yalnızca bu form için gereken verileri sağlamak üzere tasarlanmış kullanıcı arabirimi düzeyinde bir hizmettir:
using System.Collections.Generic;
namespace ViewInjectSample.Model.Services
{
public class ProfileOptionsService
{
public List<string> ListGenders()
{
// keeping this simple
return new List<string>() {"Female", "Male"};
}
public List<State> ListStates()
{
// a few states from USA
return new List<State>()
{
new State("Alabama", "AL"),
new State("Alaska", "AK"),
new State("Ohio", "OH")
};
}
public List<string> ListColors()
{
return new List<string>() { "Blue","Green","Red","Yellow" };
}
}
}
Önemli
bağımlılık ekleme Startup.ConfigureServices
yoluyla istediğiniz türleri 'ye kaydetmeyi unutmayın. Hizmet sağlayıcısı aracılığıyla GetRequiredServicedahili olarak sorgulandığından, kaydedilmemiş bir tür çalışma zamanında bir özel durum oluşturur.
Hizmetleri Geçersiz Kılma
Yeni hizmetler eklemeye ek olarak, bu teknik bir sayfaya önceden eklenen hizmetleri geçersiz kılmak için de kullanılabilir. Aşağıdaki şekilde, ilk örnekte kullanılan sayfada bulunan tüm alanlar gösterilmektedir:
Gördüğünüz gibi, varsayılan alanlar , ve (eklediğimiz alanların yanı StatsService
sıra) içerirHtml
.Url
Component
Örneğin, varsayılan HTML Yardımcılarını kendi HTML Yardımcılarınızla değiştirmek isterseniz, bunu kullanarak @inject
kolayca yapabilirsiniz:
@using System.Threading.Tasks
@using ViewInjectSample.Helpers
@inject MyHtmlHelper Html
<!DOCTYPE html>
<html>
<head>
<title>My Helper</title>
</head>
<body>
<div>
Test: @Html.Value
</div>
</body>
</html>
Mevcut hizmetleri genişletmek istiyorsanız, mevcut uygulamadan devralma veya kendi uygulamanızla sarmalama sırasında bu tekniği kullanmanız yeterlidir.
Ayrıca bkz:
- Simon Timms Blogu: Arama Verilerini Görünümünüzde Alma
ASP.NET Core