Model-View-Controller (MVC) mimarisi, modern, kullanılabilir bir web uygulaması içinde ayrı ayrı bir tasarım modelidir, MVC'nin her adımını ASP.NET Core'da test bileşenleri ve ölçek özellikleri zamanla yapılır.
Derinlikteki MVC Deseni Anlayın
Koda girmeden önce, MVC'nin üç temel bileşeninin bir kullanıcı isteğiyle nasıl başa çıkabileceğini anlamak önemlidir.
- [FONT:0) Model[Dönetici: Veri yapısını ve iş kurallarını temsil eder. UI hakkında bilgi veya verinin nasıl görüntülendiğini bilmiyorlar. Modeller genellikle basit C# sınıfları içerir, doğrulama mantığı ve veri erişimi (Entity Framework Core aracılığıyla).
- [FONT:0)View[DÜDÜDÜDÜDÜDÜDÜSÜŞÜNÜ: 0 )|Parts the user Interface.In ASP.NET Core, views are Razor files ('.cshtml') HTML işaretini sunucu-side C kodu ile birleştiren, sadece karmaşık mantık içermemelidir.
- [FONT:0)Denetler[Döneticiler: Aracılık olarak hareket eder. Bu, hangi modeli kullanacağına karar verir ve denetçilerin belirli rotalara göre haritadaki eylem yöntemlerini seçer.
ASP.NET Core MVC'de tipik istek akışı: bir kullanıcı bir URL'ye (örneğin, 03.) seyahat eder ve kullanıcının gönderdiği bir HTML yanıtı döndürür.
Önlemler Önlemler
- [FONT=0) .NET SDK[[Dönetici:0) [0)0) [0=0)) .NET SDK[[Dönetici:0) indir.
- [FONT=0)Visual Studio[Dönetici:0)[Dönetici:2)Visual Studio Code[DDönetici: 3) veya herhangi bir tercih edilen kod editörü.
- C# ve web geliştirme konseptleriyle temel aşinalık.
Adım 1: Yeni ASP.NET Core MVC Project oluşturmak
.NET CLI veya Visual Studio ile başlayabilirsiniz. Her ikisi de standart MVC klasör yapısını inceleyen bir proje şablonu sunar.
Komut Line'ı kullanarak
Bir terminal açın ve koşma:
dotnet new mvc -n MyMvcApp
Bu, yeni bir klasörde bulunan bir proje yaratır. Oluşturulan yapı, [[Şerefli: [[DÜyetim: 16) ve [[Dön dosyaları için.
Visual Studio
Visual Studio, chooseurFLT:0) Yeni bir proje → seçin [FONT:2).ASP.NET Core Web App (Model-View-Controller)) → Proje adınızı ve yerini yapılandırın → .NET sürümünüzü seçin (örneğin, .NET)
Projenin çalışmasını sağlamak:
cd MyMvcApp
dotnet run
OpenFLT:9 varsayılan ev sayfasını görmek için.
2. Adım: Proje Yapısını Anlayın
Sördülü proje birkaç anahtar öğe içerir:
- [FONT:0)Denetler[[Döneticiler)[Döneticiler: C# kontrolör sınıfları ekleyeceğiniz boş klasör.
- [FONT:0]Models[Dönetici: Alan sınıflarınız ve görüntü modelleri için yer.
- [FONT:0)Views[DÜT:1]: AAHFLT:10) ve [[DÜye ait klasörü varsayılan olarak artı aENFLT:12).
- [FONT=0)Program.cs): Uygulama başlatıcısı, hangi hizmetler (MVC dahil) yapılandırılır.
OpenFLT:13) ve MVC'yi etkinleştiren hatları not edin:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
...
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Bu, haritaların URL'leri gibi varsayılan rotayı ayarlar. ”-
Adım 3: Model Sınıfı Oluşturma
Modeller uygulamanızın çalışmalarınızı temsil eder. aurFLT:17) klasörün içindeki model oluşturmakla başlayın.
// Models/Product.cs
namespace MyMvcApp.Models;
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
public string? Description { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
Geçerlilik için veri annotasyonları ile model zenginleştirebilirsiniz:
using System.ComponentModel.DataAnnotations;
public class Product
{
public int Id { get; set; }
[Required(ErrorMessage = "Product name is required.")]
[StringLength(100)]
public string Name { get; set; } = string.Empty;
[Range(0.01, 10000)]
public decimal Price { get; set; }
[MaxLength(500)]
public string? Description { get; set; }
[Display(Name = "Created")]
public DateTime CreatedAt { get; set; }
}
Gerçek bir uygulamada, genellikle MVC akışına odaklanmamız için veri içip kullanabileceğimiz bir veritabanı kapsamı (Entity Framework Core) ekleyecektir.
Adım 4: Bir denetçi eklemek
Kontrolcüler yanıtın geri gelmesini ve orkestrayı işliyor. aİLETİŞİMELİĞİ KAYNAKLARI: KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAK
// Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;
using MyMvcApp.Models;
using System.Collections.Generic;
namespace MyMvcApp.Controllers;
public class ProductsController : Controller
{
// Simulate a data source
private static List<Product> _products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 999.99m },
new Product { Id = 2, Name = "Smartphone", Price = 599.99m },
new Product { Id = 3, Name = "Tablet", Price = 399.99m }
};
// GET: /Products
public IActionResult Index()
{
return View(_products); // Pass list to the view
}
// GET: /Products/Details/5
public IActionResult Details(int id)
{
var product = _products.Find(p => p.Id == id);
if (product == null)
return NotFound();
return View(product);
}
// GET: /Products/Create
public IActionResult Create()
{
return View();
}
// POST: /Products/Create
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Product product)
{
if (ModelState.IsValid)
{
product.Id = _products.Max(p => p.Id) + 1;
product.CreatedAt = DateTime.UtcNow;
_products.Add(product);
return RedirectToAction(nameof(Index));
}
return View(product);
}
}
Anahtar noktaları:
- [FONTD:0]İsveç [Dönetici: 1) Geri dönüş türüdür. [Üye Olmayanlar, AŞAM, AŞUŞUŞUŞUŞUŞUŞUYUN, ÂNİN, ÂHİR, ÂHİRLER, ÂHİRLER, ÂHİRLER, ÂHİRLER, ÂHİR ÂHİRLER.
- Kontrol sonrası adında bir klasörde görüntülenen eylem isimleri haritası ([Dönemli: · 4 ).
- [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=INT=FONT=FONT=FONT=FONT=FONT=
- [FONT: ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
Adım 5: Razor Syntax ile Görüntüleme Oluşturun
Görüntülemeler, paylaşılan düzen ise, [[Gizem'dedir.
Index View – Ekran a List
A)
@model IEnumerable<MyMvcApp.Models.Product>
@{
ViewData["Title"] = "Product List";
}
<h2>@ViewData["Title"]</h2>
<table class="table table-striped">
<thead>
<tr>
<th>@Html.DisplayNameFor(model => model.Id)</th>
<th>@Html.DisplayNameFor(model => model.Name)</th>
<th>@Html.DisplayNameFor(model => model.Price)</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.Id</td>
<td>@item.Name</td>
<td>@item.Price.ToString("C")</td>
<td>
<a asp-action="Details" asp-route-id="@item.Id">Details</a>
</td>
</tr>
}
</tbody>
</table>
<p>
<a asp-action="Create" class="btn btn-primary">Create New Product</a>
</p>
[FONT:0)Razor ipuçları[[Dönem: HTML'den C#'ye kadar geçiş yapmak için [[Döneticileri kullanın ve / etiketi URL'leri oluşturmak için yardımcı olur.
Detaylar View
A.Ş. ÂH. ÂH. ÂH.
@model MyMvcApp.Models.Product
@{
ViewData["Title"] = "Product Details";
}
<h2>@Model.Name</h2>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Id)</dt>
<dd class="col-sm-10">@Model.Id</dd>
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Price)</dt>
<dd class="col-sm-10">@Model.Price.ToString("C")</dd>
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Description)</dt>
<dd class="col-sm-10">@Model.Description</dd>
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CreatedAt)</dt>
<dd class="col-sm-10">@Model.CreatedAt</dd>
</dl>
<a asp-action="Index">Back to List</a>
Form View with Form ile Create View with Form
A.Ş. ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
@model MyMvcApp.Models.Product
@{
ViewData["Title"] = "Create Product";
}
<h2>Create</h2>
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Name"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Description"></label>
<textarea asp-for="Description" class="form-control"></textarea>
</div>
<button type="submit" class="btn btn-primary">Create</button>
<a asp-action="Index" class="btn btn-secondary">Cancel</a>
</form>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Razor etiketi, model bağlayıcı ve geçerlilik ile form alanları üretiyor.TheurFLT:42) Yük istemci-ön doğrulama senaryoları.
Adım 6: Routing ve Özel Yollar ekle
MVC, varsayılan olarak sözleşme bazlı routing kullanır. (örneğin, kontrol için daha fazla kontrol için özellik eklemeyi de ekleyebilirsiniz. Örneğin, kontrolörde:)
[Route("products")]
public class ProductsController : Controller
{
[Route("")] // matches /products
[Route("index")] // matches /products/index
public IActionResult Index() { ... }
[Route("{id:int}")] // matches /products/5
public IActionResult Details(int id) { ... }
}
Bu yaklaşım, RESTful API'ler için, [[ŞUYGÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜK-ŞÜK-ŞÜK-Öğretim.
Adım 7: Kompleksi için ViewModels Kullanımı
Genellikle bir görüntüye birden fazla veri nesnesi geçmek veya ekstra özellikler dahil etmek gerekir (örneğin listeler, sayfa başlıkları). Bu görüntü modellerinin içeri geldiği yer.
namespace MyMvcApp.Models.ViewModels;
public class ProductIndexViewModel
{
public IEnumerable<Product> Products { get; set; }
public string SearchString { get; set; } = string.Empty;
public decimal MaxPrice { get; set; } = 10000;
}
Sonra, görüntü modelini popül etmek ve onu görüşe geçmek için kontrol edici eylemi ayarlamak. görünüm kullanımları [FONTT:49] ve buna göre erişimleri sağlar.
Adım 8: Geçerlilik Uygulayın
ASP.NET Core MVC hem sunucu hem de müşteri odaklı bir şekilde veri antropları aracılığıyla geçerlilik sağlar. AddurFLT:50)., [[Ücretsiz ve özel özellikler.ŞUygunT:54|s.
Özel geçerlilik mantığı için, modelinizde veya ayrı bir geçerlilik sınıfı oluşturmak için geçerlidir. Resmi [[0)ASP.NET Core doğrulama belgesi) bu kalıpları ayrıntılı olarak kapsar.
Adım 9: Kontrolcülerde Bağlanma Enjeksiyonu
Sert kodlama verileri yerine, hizmetleri (örneğin bir depo veya veritabanı bağlamı gibi) kontrol yapısına enjekte edebilirsiniz. Bu, gevşek darbe ve test edilebilirliği teşvik eder.
public class ProductsController : Controller
{
private readonly IProductRepository _repository;
public ProductsController(IProductRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
var products = _repository.GetAll();
return View(products);
}
}
Verository inurFLT:58)
builder.Services.AddScoped<IProductRepository, ProductRepository>();
Bu model uygulamanızı daha temiz ve daha güvenli hale getirir. SeeurFLT:0) Microsoft'un Bağımlılığı Enjeksiyon rehberi) daha fazla için kayıt yaptırır.
Adım 10: Layouts ve Partial Views ile Çalışma
Ortak yapılar (örneğin, navigasyon, ayaklama veya ürün kartı gibi kısmi görüşleri tanımlayabilirsiniz.)
Örnek kısmi görüşFL:64).
@model Product
<div class="card">
<div class="card-body">
<h5 class="card-title">@Model.Name</h5>
<p class="card-text">Price: @Model.Price.ToString("C")</p>
<a asp-action="Details" asp-route-id="@Model.Id" class="btn btn-primary">Details</a>
</div>
</div>
Bunu, [[Selam:66) ile herhangi bir görüşe ekleyin.
Adım 11: Hata ve Durum Kodları
Kontrolcüler hataları dikkatle ele almalıdır.UseFLT:67) bloklar veya orta sınıflar aracılığıyla küresel bir istisna eller. uygun HTTP statüsü kodlarına geri dön:
- (A)
- [03.09.2012]
- [FONT:70] sunucu hataları için.
Ayrıca özel bir hata görüşü de ekleyebilirsiniz: [[Dönetici:71| zaten şablona dahil edilmiştir. SeturFLT:72). üretimde istisnaları yönlendirmeye yönelik olarak.
Adım 12: MVC Uygulamasını Test Etmek
Test eleştireldir. xUnit ve theurFLT:74) entegrasyon testleri yazmak için paket kullanın. Örnek for theurFLT:75)
public class ProductsControllerTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly HttpClient _client;
public ProductsControllerTests(WebApplicationFactory<Program> factory)
{
_client = factory.CreateClient();
}
[Fact]
public async Task Index_ReturnsSuccessAndCorrectContentType()
{
var response = await _client.GetAsync("/products");
response.EnsureSuccessStatusCode();
Assert.Equal("text/html; charset=utf-8",
response.Content.Headers.ContentType.ToString());
}
}
Kontrollüleri mantığı izole etmek için alay eden hizmetler test edin.TheETHFLT:0)ASP.NET Core test belgeleri[[Dön 1: 1) geniş örnekler sunar.
En İyi Uygulamalar ve Gelişmiş İpuçları
- [FONT:0) Kontrolcüleri ince tutun[[Dönetici: İş mantığı, eylem yöntemlerinde değil, hizmet / talepkarlara aittir.
- [FONT:0) Görünüm modelleri): Doğrudan görüşlere geçiş yapmak; gerekli olduğu gibi verileri şekillendirmek için özel bakış modelleri kullanın.
- [FONT:0]Leverage etiketi yardımcıları[[Döntgen: 1) HTML temizleyicilerini yaparlar ve form bağlayıcı olarak hataları azaltırlar.
- [FONT:0)Enable müşteri tarafı geçerliliği[Dönemli: ﴾77﴿ ve [[Dönetici: 75)[değiştir | kaynağı değiştir]
- [0]Ben/O-yaralı operasyonlar için bir alternatif eylemi kullanın: [[Dönetici: 80||||||||||->
- [FONT:0) Uygulamanızı ([Dönetici: 0 3) (İngilizce) · 0:0) · Uygulamanızı (Dönetici) indirebilirsiniz.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
ASP.NET Core'deki MVC mimarisini uygulamak, organize edilen, test edilebilir ve kullanılabilir olan web uygulamaları oluşturmak için sağlam bir temel sağlar.Modelleri, görüşleri ve kontrolörleri ayırarak, uygulamanızı bağımsız olarak ölçekleyebilirsiniz.[Döneticileri ile birlikte çalışırsınız.)ASP.NET Core MVC genel bakış açınız, bilginizi derinleştirmek için proje oluşturmanız için tam bir sonraki kaynak sağlar.