Bölüm 6, denetleyici yöntemleri ve ASP.NET Core
Gönderen Rick Anderson
Film uygulamasına iyi bir başlangıç yapmaya başlayabiliriz ancak sunum ideal değildir. Örneğin ReleaseDate iki sözcük olabilir.

Models/Movie.cs dosyasını açın ve aşağıda gösterilen vurgulanan satırları ekleyin:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string? Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string? Genre { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
}
}
Sonraki öğreticide DataAnnotations'ı kapsıyoruz. Display özniteliği, bir alanın adı için ne görüntülen bir değer belirtir (bu durumda "ReleaseDate" yerine "Sürüm Tarihi"). DataType özniteliği, verilerin türünü (Date) belirtir, bu nedenle alanda depolanan saat bilgileri görüntülenmez.
Verilerin [Column(TypeName = "decimal(18, 2)")] veritabanındaki para birimiyle Entity Framework Core için veri Price ek açıklaması gereklidir. Daha fazla bilgi için bkz. Veri Türleri.
Denetleyiciye göz Movies atarak hedef URL'yi görmek için fare işaretçisini bir Düzenle bağlantısının üzerinde tutun.

Düzenleme, Ayrıntılar ve Silme bağlantıları, Views/Movies/Index.cshtml dosyasındaKi Çekirdek MVC Sabit Noktası Etiketi Yardımcısı tarafından oluşturulur.
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
Etiket Yardımcıları, sunucu tarafı kodunun dosyalarda HTML öğeleri oluşturma ve işlemeye katılmalarını Razor sağlar. Yukarıdaki kodda, denetleyici AnchorTagHelper eylem yönteminden ve yol kimliğinden HTML href özniteliği değerini dinamik olarak oluşturur. En sevdiğiniz tarayıcıdan Kaynağı Görüntüle'yi veya oluşturulan işaretlemeyi incelemek için geliştirici araçlarını kullanırsınız. Oluşturulan HTML'nin bir kısmı aşağıda gösterilmiştir:
<td>
<a href="/Movies/Edit/4"> Edit </a> |
<a href="/Movies/Details/4"> Details </a> |
<a href="/Movies/Delete/4"> Delete </a>
</td>
Program.cs dosyasındaki yönlendirme kümesi biçimini hatırlayın:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
ASP.NET Core https://localhost:5001/Movies/Edit/4 isteği, Edit 4 parametresiyle Movies denetleyicinin eylem Id yöntemine çevirir. (Denetleyici yöntemleri eylem yöntemleri olarak da bilinir.)
Etiket Yardımcıları, ASP.NET Core'daki en popüler yeni özelliklerden ASP.NET Core. Daha fazla bilgi için bkz. Ek kaynaklar.
Denetleyiciyi Movies açın ve iki eylem yöntemini Edit inceler. Aşağıdaki kod, HTTP GET Edit film getirerek Edit.cshtml dosyası tarafından oluşturulan düzenleme formunu dolduran yöntemini Razor gösterir.
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Aşağıdaki kod, gönderilen HTTP POST Edit film değerlerini işleyen yöntemini gösterir:
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
özniteliği, [Bind] aşırı göndermeye karşı korumanın bir yolu olur. Özellikleri yalnızca değiştirmek istediğiniz [Bind] özniteliğine dahil etmek gerekir. Daha fazla bilgi için bkz. Denetleyicinizi fazla gönderiye karşı koruma. ViewModels, fazla gönderiyi önlemek için alternatif bir yaklaşım sağlar.
İkinci eylem Edit yönteminin önce özniteliğine sahip olduğunu [HttpPost] farkedin.
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
HttpPostözniteliği, bu Edit yöntemin yalnızca istekler için çağrıl POST olduğunu belirtir. özniteliğini [HttpGet] ilk düzenleme yöntemine uygulayabilirsiniz, ancak varsayılan değer olduğundan [HttpGet] bu gerekli değildir.
özniteliği, bir isteğin sahtesini önlemek için kullanılır ve düzenleme görünümü dosyasında oluşturulan bir sahteciliğe karşı koruma belirteci ile eşlendi ValidateAntiForgeryToken (Views/Movies/Edit.cshtml). Düzenleme görünümü dosyası, Form Etiketi Yardımcısı ile sahtecilik önleme belirteci üretir.
<form asp-action="Edit">
Form Etiketi Yardımcısı, Movies denetleyicisinin yönteminde oluşturulan sahtecilik önleme belirtecinde eşleşmesi gereken gizli [ValidateAntiForgeryToken] bir sahtecilik önleme Edit belirteci üretir. Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
yöntemi film parametresini alır, Entity Framework yöntemini kullanarak filme bakarak seçilen HttpGet Edit ID FindAsync filmi Düzenleme görünümüne döndürür. Bir film bulunamazsa NotFound (HTTP 404) döndürülür.
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Yapı iskelesi sistemi Düzenleme görünümünü oluşturduğunda sınıfını inceledi ve sınıfın her özelliği için ve öğelerini Movie <label> işlemek üzere kod <input> oluşturdu. Aşağıdaki örnek, yapı iskelesi sistemi tarafından oluşturulan Visual Studio görünümünü gösterir:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Id" />
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ReleaseDate" class="control-label"></label>
<input asp-for="ReleaseDate" class="form-control" />
<span asp-validation-for="ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Genre" class="control-label"></label>
<input asp-for="Genre" class="form-control" />
<span asp-validation-for="Genre" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Görünüm şablonunun dosyanın üst @model MvcMovie.Models.Movie kısmında bir deyiminin olduğunu fark vardır. @model MvcMovie.Models.Movie görünümün, görünüm şablonunun modelinin türünde olmasını beklediğinizi Movie belirtir.
İskeleli kod, HTML işaretlemesini basit hale getirmek için çeşitli Etiket Yardımcı yöntemlerini kullanır. Etiket Etiketi Yardımcısı, alanın adını ("Title", "ReleaseDate", "Genre" veya "Price") görüntüler. Giriş Etiketi Yardımcısı bir HTML öğesini <input> işler. Doğrulama Etiketi Yardımcısı, bu özellikle ilişkili doğrulama iletilerini görüntüler.
Uygulamayı çalıştırın ve /Movies URL'ye gidin. Düzenle bağlantısına tıklayın. Tarayıcıda sayfanın kaynağını görüntüleyebilirsiniz. öğesi için oluşturulan HTML <form> aşağıda gösterilmiştir.
<form action="/Movies/Edit/7" method="post">
<div class="form-horizontal">
<h4>Movie</h4>
<hr />
<div class="text-danger" />
<input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" />
<div class="form-group">
<label class="control-label col-md-2" for="Genre" />
<div class="col-md-10">
<input class="form-control" type="text" id="Genre" name="Genre" value="Western" />
<span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Price" />
<div class="col-md-10">
<input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" />
<span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>
</div>
<!-- Markup removed for brevity -->
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" />
</form>
Öğeler, <input> özniteliği HTML <form> action URL'ye gönderi yapmak için ayarlanmış bir /Movies/Edit/id öğededir. Düğme tıkıldığında form verileri Save sunucuya yayınlanmıştır. Kapanış öğesi öncesinde son </form> satır, Form Etiketi Yardımcısı tarafından oluşturulan gizli XSRF belirteci gösterir.
POST İsteği İşleme
Aşağıdaki liste eylem [HttpPost] yönteminin Edit sürümünü gösterir.
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
özniteliği, Form Etiketi Yardımcısı'nın sahteciliğe karşı koruma belirteci oluşturucu tarafından oluşturulan gizli [ValidateAntiForgeryToken] XSRF belirteci doğrular
Model bağlama sistemi, gönderilen form değerlerini alır ve Movie parametre olarak geçirilen bir nesnesi movie oluşturur. özelliği, formda gönderilen verilerin bir nesneyi değiştirmek (düzenlemek veya ModelState.IsValid güncelleştirmek) için kullanıla olduğunu Movie doğrular. Veriler geçerli ise kaydedilir. Güncelleştirilmiş (düzenlenen) film verileri veritabanı bağlamının yöntemi SaveChangesAsync çağrılarak veritabanına kaydedilir. Verileri kaydeddikten sonra kod, kullanıcıyı sınıfının eylem yöntemine yeniden yönlendirerek az önce yapılan değişiklikler dahil Index olmak üzere film koleksiyonunu MoviesController görüntüler.
Form sunucuya gönderildiklerinden önce, istemci tarafı doğrulama alanlardaki doğrulama kurallarını denetler. Herhangi bir doğrulama hatası varsa bir hata iletisi görüntülenir ve form görüntülenmez. JavaScript devre dışı bırakılırsa istemci tarafı doğrulamanız olmaz, ancak sunucu geçerli olmayan gönderilen değerleri algılar ve form değerleri hata iletileriyle yeniden oynatılacaktır. Öğreticinin ilerleyen adımlarında Model Doğrulamayı daha ayrıntılı bir şekilde inceleeceğiz. Views/Movies/Edit.cshtml görünüm şablonunda Doğrulama Etiketi Yardımcısı uygun hata iletilerinin görüntülenmesiyle ilgilenin.

Film HttpGet denetleyicisinde tüm yöntemler benzer bir desen kullanır. Bir film nesnesi (veya örneğinde nesne listesi) ve nesneyi Index (model) görünüme iletir. yöntemi, Create görünüme boş bir film nesnesi Create iletir. Verileri oluşturmak, düzenlemek, silmek veya başka bir şekilde değiştirmek için kullanılan tüm yöntemler yöntemin [HttpPost] aşırı yüklemesinde bunu yapar. Bir yöntemde verileri HTTP GET değiştirmek güvenlik riskidir. Bir yöntemde verilerin değiştirilmesi, HTTP en iyi yöntemlerini ve GET isteklerinin uygulama durumunu değiştirmesi gerektiğini belirten mimari HTTP GET REST desenini de ihlal ediyor. Başka bir deyişle GET işlemi gerçekleştirmek, yan etkileri olmayan ve kalıcı verilerinizi değiştirmeyen güvenli bir işlemdir.
Ek kaynaklar
- Genelleştirme ve yerelleştirme
- Etiket Yardımcıları'ne Giriş
- Etiket Yardımcıları Yazma
- ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle
- Denetleyicinizi fazla gönderiye karşı koruma
- ViewModels
- Form Etiketi Yardımcısı
- Giriş Etiketi Yardımcısı
- Etiket Etiketi Yardımcısı
- Seçim Etiketi Yardımcısı
- Doğrulama Etiketi Yardımcı
Film uygulamasına iyi bir başlangıç yapmaya başlayabiliriz ancak sunum ideal değildir. Örneğin ReleaseDate iki sözcük olabilir.

Models/Movie.cs dosyasını açın ve aşağıda gösterilen vurgulanan satırları ekleyin:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
}
}
Sonraki öğreticide DataAnnotations'ı kapsıyoruz. Display özniteliği, bir alanın adı için ne görüntülen bir değer belirtir (bu durumda "ReleaseDate" yerine "Sürüm Tarihi"). DataType özniteliği, verilerin türünü (Date) belirtir, bu nedenle alanda depolanan saat bilgileri görüntülenmez.
Verilerin [Column(TypeName = "decimal(18, 2)")] veritabanındaki para birimiyle Entity Framework Core için veri Price ek açıklaması gereklidir. Daha fazla bilgi için bkz. Veri Türleri.
Denetleyiciye göz Movies atarak hedef URL'yi görmek için fare işaretçisini bir Düzenle bağlantısının üzerinde tutun.

Düzenleme, Ayrıntılar ve Silme bağlantıları, Views/Movies/Index.cshtml dosyasındaKi Çekirdek MVC Sabit Noktası Etiketi Yardımcısı tarafından oluşturulur.
<a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
<a asp-action="Details" asp-route-id="@item.ID">Details</a> |
<a asp-action="Delete" asp-route-id="@item.ID">Delete</a>
</td>
</tr>
Etiket Yardımcıları, sunucu tarafı kodunun dosyalarda HTML öğeleri oluşturma ve işlemeye katılmalarını Razor sağlar. Yukarıdaki kodda, denetleyici AnchorTagHelper eylem yönteminden ve yol kimliğinden HTML href özniteliği değerini dinamik olarak oluşturur. En sevdiğiniz tarayıcıdan Kaynağı Görüntüle'yi veya oluşturulan işaretlemeyi incelemek için geliştirici araçlarını kullanırsınız. Oluşturulan HTML'nin bir kısmı aşağıda gösterilmiştir:
<td>
<a href="/Movies/Edit/4"> Edit </a> |
<a href="/Movies/Details/4"> Details </a> |
<a href="/Movies/Delete/4"> Delete </a>
</td>
Startup.cs dosyasındaki yönlendirme kümesi biçimini hatırlayın:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
ASP.NET Core https://localhost:5001/Movies/Edit/4 isteği, Edit 4 parametresiyle Movies denetleyicinin eylem Id yöntemine çevirir. (Denetleyici yöntemleri eylem yöntemleri olarak da bilinir.)
Etiket Yardımcıları, ASP.NET Core'daki en popüler yeni özelliklerden ASP.NET Core. Daha fazla bilgi için bkz. Ek kaynaklar.
Denetleyiciyi Movies açın ve iki eylem yöntemini Edit inceler. Aşağıdaki kod, HTTP GET Edit film getirerek Edit.cshtml dosyası tarafından oluşturulan düzenleme formunu dolduran yöntemini Razor gösterir.
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Aşağıdaki kod, gönderilen HTTP POST Edit film değerlerini işleyen yöntemini gösterir:
// POST: Movies/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(movie);
}
özniteliği, [Bind] aşırı göndermeye karşı korumanın bir yolu olur. Özellikleri yalnızca değiştirmek istediğiniz [Bind] özniteliğine dahil etmek gerekir. Daha fazla bilgi için bkz. Denetleyicinizi fazla gönderiye karşı koruma. ViewModels, fazla gönderiyi önlemek için alternatif bir yaklaşım sağlar.
İkinci eylem Edit yönteminin önce özniteliğine sahip olduğunu [HttpPost] farkedin.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
HttpPostözniteliği, bu Edit yöntemin yalnızca istekler için çağrıl POST olduğunu belirtir. özniteliğini [HttpGet] ilk düzenleme yöntemine uygulayabilirsiniz, ancak varsayılan değer olduğundan [HttpGet] bu gerekli değildir.
özniteliği, bir isteğin sahtesini önlemek için kullanılır ve düzenleme görünümü dosyasında oluşturulan bir sahteciliğe karşı koruma belirteci ile eşlendi ValidateAntiForgeryToken (Views/Movies/Edit.cshtml). Düzenleme görünümü dosyası, Form Etiketi Yardımcısı ile sahtecilik önleme belirteci üretir.
<form asp-action="Edit">
Form Etiketi Yardımcısı, Movies denetleyicisinin yönteminde oluşturulan sahtecilik önleme belirtecinde eşleşmesi gereken gizli [ValidateAntiForgeryToken] bir sahtecilik önleme Edit belirteci üretir. Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
yöntemi film parametresini alır, Entity Framework yöntemini kullanarak HttpGet Edit ID filme bakarak seçilen FindAsync filmi Düzenleme görünümüne döndürür. Bir film bulunamazsa NotFound (HTTP 404) döndürülür.
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
Yapı iskelesi sistemi Düzenleme görünümünü oluşturduğunda sınıfını inceledi ve sınıfın her özelliği için ve öğelerini Movie <label> işlemek üzere kod <input> oluşturdu. Aşağıdaki örnek, yapı iskelesi sistemi tarafından oluşturulan Visual Studio görünümünü gösterir:
@model MvcMovie.Models.Movie
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Movie</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Id" />
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ReleaseDate" class="control-label"></label>
<input asp-for="ReleaseDate" class="form-control" />
<span asp-validation-for="ReleaseDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Genre" class="control-label"></label>
<input asp-for="Genre" class="form-control" />
<span asp-validation-for="Genre" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Görünüm şablonunun dosyanın üst @model MvcMovie.Models.Movie kısmında bir deyiminin olduğunu fark vardır. @model MvcMovie.Models.Movie görünümün, görünüm şablonunun modelinin türünde olmasını beklediğinizi Movie belirtir.
İskeleli kod, HTML işaretlemesini basit hale getirmek için çeşitli Etiket Yardımcı yöntemlerini kullanır. Etiket Etiketi Yardımcısı, alanın adını ("Title", "ReleaseDate", "Genre" veya "Price") görüntüler. Giriş Etiketi Yardımcısı bir HTML öğesini <input> işler. Doğrulama Etiketi Yardımcısı, bu özellikle ilişkili doğrulama iletilerini görüntüler.
Uygulamayı çalıştırın ve /Movies URL'ye gidin. Düzenle bağlantısına tıklayın. Tarayıcıda sayfanın kaynağını görüntüleyebilirsiniz. öğesi için oluşturulan HTML <form> aşağıda gösterilmiştir.
<form action="/Movies/Edit/7" method="post">
<div class="form-horizontal">
<h4>Movie</h4>
<hr />
<div class="text-danger" />
<input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" />
<div class="form-group">
<label class="control-label col-md-2" for="Genre" />
<div class="col-md-10">
<input class="form-control" type="text" id="Genre" name="Genre" value="Western" />
<span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Price" />
<div class="col-md-10">
<input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" />
<span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>
</div>
<!-- Markup removed for brevity -->
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" />
</form>
Öğeler, <input> özniteliği HTML <form> action URL'ye gönderi yapmak için ayarlanmış bir /Movies/Edit/id öğededir. Düğme tıkıldığında form verileri Save sunucuya yayınlanmıştır. Kapanış öğesi öncesinde son </form> satır, Form Etiketi Yardımcısı tarafından oluşturulan gizli XSRF belirteci gösterir.
POST İsteği İşleme
Aşağıdaki liste eylem [HttpPost] yönteminin Edit sürümünü gösterir.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}
özniteliği, Form Etiketi Yardımcısı'nın sahteciliğe karşı koruma belirteci oluşturucu tarafından oluşturulan gizli [ValidateAntiForgeryToken] XSRF belirteci doğrular
Model bağlama sistemi, gönderilen form değerlerini alır ve Movie parametre olarak geçirilen bir nesnesi movie oluşturur. özelliği, formda gönderilen verilerin bir nesneyi değiştirmek (düzenlemek veya ModelState.IsValid güncelleştirmek) için kullanıla olduğunu Movie doğrular. Veriler geçerli ise kaydedilir. Güncelleştirilmiş (düzenlenen) film verileri veritabanı bağlamının yöntemi SaveChangesAsync çağrılarak veritabanına kaydedilir. Verileri kaydeddikten sonra kod, kullanıcıyı sınıfının eylem yöntemine yeniden yönlendirerek az önce yapılan değişiklikler dahil Index olmak üzere film koleksiyonunu MoviesController görüntüler.
Form sunucuya gönderildiklerinden önce, istemci tarafı doğrulama alanlardaki doğrulama kurallarını denetler. Herhangi bir doğrulama hatası varsa bir hata iletisi görüntülenir ve form görüntülenmez. JavaScript devre dışı bırakılırsa istemci tarafı doğrulamanız olmaz, ancak sunucu geçerli olmayan gönderilen değerleri algılar ve form değerleri hata iletileriyle yeniden oynatılacaktır. Öğreticinin ilerleyen adımlarında Model Doğrulamayı daha ayrıntılı bir şekilde inceleeceğiz. Views/Movies/Edit.cshtml görünüm şablonunda Doğrulama Etiketi Yardımcısı uygun hata iletilerinin görüntülenmesiyle ilgilenin.

Film HttpGet denetleyicisinde tüm yöntemler benzer bir desen kullanır. Bir film nesnesi (veya örneğinde nesne listesi) ve nesneyi Index (model) görünüme iletir. yöntemi, Create görünüme boş bir film nesnesi Create iletir. Verileri oluşturmak, düzenlemek, silmek veya başka bir şekilde değiştirmek için kullanılan tüm yöntemler yöntemin [HttpPost] aşırı yüklemesinde bunu yapar. Bir yöntemde verileri HTTP GET değiştirmek güvenlik riskidir. Bir yöntemde verilerin değiştirilmesi, HTTP en iyi yöntemlerini ve GET isteklerinin uygulama durumunu değiştirmesi gerektiğini belirten mimari HTTP GET REST desenini de ihlal ediyor. Başka bir deyişle GET işlemi gerçekleştirmek, yan etkileri olmayan ve kalıcı verilerinizi değiştirmeyen güvenli bir işlemdir.
Ek kaynaklar
- Genelleştirme ve yerelleştirme
- Etiket Yardımcıları'ne Giriş
- Etiket Yardımcıları Yazma
- ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle
- Denetleyicinizi fazla gönderiye karşı koruma
- ViewModels
- Form Etiketi Yardımcısı
- Giriş Etiketi Yardımcısı
- Etiket Etiketi Yardımcısı
- Seçim Etiketi Yardımcısı
- Doğrulama Etiketi Yardımcı