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.jsongibi 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 StatisticsServicedosyasından doldurulur. Bu hizmet içinde bağımlılık ekleme ConfigureServicesProgram.csiç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:

To Do view listing total items, completed items, average priority, and a list of tasks with their priority levels and boolean values indicating completion.

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 Sayfası 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:

Update Profile view with a form allowing the entry of name, gender, state, and favorite Color.

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:

Intellisense contextual menu on a typed @ symbol listing Html, Component, StatsService, and Url fields

Varsayılan alanlar , Componentve Urlalanları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:

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 @injectsöz dizimi: @inject <type> <name>

kullanan @injectbir ö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 StatisticsServicedosyasından doldurulur. Bu hizmet içinde bağımlılık ekleme ConfigureServicesStartup.csiç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:

To Do view listing total items, completed items, average priority, and a list of tasks with their priority levels and boolean values indicating completion.

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:

Update Profile view with a form allowing the entry of name, gender, state, and favorite Color.

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.ConfigureServicesyoluyla 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:

Intellisense contextual menu on a typed @ symbol listing Html, Component, StatsService, and Url fields

Gördüğünüz gibi, varsayılan alanlar , ve (eklediğimiz alanların yanı StatsService sıra) içerirHtml.UrlComponent Örneğin, varsayılan HTML Yardımcılarını kendi HTML Yardımcılarınızla değiştirmek isterseniz, bunu kullanarak @injectkolayca 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: