Düzenleme Metotlarını ve Düzenleme Görünümünü İnceleme (C#)
tarafından Rick Anderson
Not
Bu öğreticinin ASP.NET MVC 5 ve Visual Studio 2013 kullanan güncelleştirilmiş bir sürümü burada mevcuttur. Daha güvenlidir, takip etmek çok daha kolaydır ve daha fazla özellik gösterir.
Bu öğreticide, Microsoft Visual Studio'nun ücretsiz sürümü olan Microsoft Visual Web Developer 2010 Express Service Pack 1'i kullanarak ASP.NET MVC Web uygulaması oluşturmanın temelleri öğretilecektir. Başlamadan önce, aşağıda listelenen önkoşulları yüklediğinizden emin olun. Aşağıdaki bağlantıya tıklayarak bunların tümünü yükleyebilirsiniz: Web Platformu Yükleyicisi. Alternatif olarak, aşağıdaki bağlantıları kullanarak önkoşulları tek tek yükleyebilirsiniz:
- Visual Studio Web Developer Express SP1 önkoşulları
- ASP.NET MVC 3 Araçları Güncelleştirmesi
- SQL Server Compact 4.0(çalışma zamanı + araçlar desteği)
Visual Web Developer 2010 yerine Visual Studio 2010 kullanıyorsanız, aşağıdaki bağlantıya tıklayarak önkoşulları yükleyin: Visual Studio 2010 önkoşulları.
C# kaynak koduna sahip bir Visual Web Developer projesi bu konuya eşlik edebilir. C# sürümünü indirin. Visual Basic'i tercih ediyorsanız bu öğreticinin Visual Basic sürümüne geçin.
Bu bölümde, film denetleyicisi için oluşturulan eylem yöntemlerini ve görünümlerini inceleyeceksiniz. Ardından özel bir arama sayfası ekleyeceksiniz.
Uygulamayı çalıştırın ve tarayıcınızın adres çubuğundaki Movies
URL'ye /Movies ekleyerek denetleyiciye göz atın. Bağlandığını URL'yi görmek için fare işaretçisini Düzenle bağlantısının üzerinde tutun.
Düzenle bağlantısı Views\Movies\Index.cshtml görünümünde yöntemi tarafından Html.ActionLink
oluşturuldu:
@Html.ActionLink("Edit", "Edit", new { id=item.ID })
Html
nesnesi, temel sınıfta bir özellik WebViewPage
kullanılarak kullanıma sunulan bir yardımcıdır. ActionLink
Yardımcının yöntemi, denetleyicilerdeki eylem yöntemlerine bağlanan HTML köprülerini dinamik olarak oluşturmayı kolaylaştırır. yönteminin ActionLink
ilk bağımsız değişkeni, işlenmek üzere bağlantı metnidir (örneğin, <a>Edit Me</a>
). İkinci bağımsız değişken, çağrılacak eylem yönteminin adıdır. Son bağımsız değişken, yol verilerini oluşturan anonim bir nesnedir (bu örnekte 4 kimliği).
Önceki görüntüde gösterilen oluşturulan bağlantı şeklindedir http://localhost:xxxxx/Movies/Edit/4
. Varsayılan yol URL desenini {controller}/{action}/{id}
alır. Bu nedenle, ASP.NET 4'e eşit parametresiyle ID
denetleyicinin Movies
eylem yöntemine bir isteğe çevrilirhttp://localhost:xxxxx/Movies/Edit/4
.Edit
Sorgu dizesini kullanarak eylem yöntemi parametrelerini de geçirebilirsiniz. Örneğin, URL http://localhost:xxxxx/Movies/Edit?ID=4
4 parametresini ID
denetleyicinin Edit
eylem yöntemine Movies
de geçirir.
Denetleyiciyi Movies
açın. İki Edit
eylem yöntemi aşağıda gösterilmiştir.
//
// GET: /Movies/Edit/5
public ActionResult Edit(int id)
{
Movie movie = db.Movies.Find(id);
return View(movie);
}
//
// POST: /Movies/Edit/5
[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
İkinci Edit
eylem yönteminin önce özniteliği olduğuna HttpPost
dikkat edin. Bu öznitelik, yöntemin aşırı yüklemesinin Edit
yalnızca POST istekleri için çağrılabileceğini belirtir. özniteliğini HttpGet
ilk düzenleme yöntemine uygulayabilirsiniz, ancak varsayılan olduğundan bu gerekli değildir. (Özniteliği örtük olarak yöntem olarak HttpGet
atanmış eylem yöntemlerine HttpGet
başvuracağız.)
HttpGet
Edit
yöntemi film kimliği parametresini alır, Entity Framework Find
yöntemini kullanarak filmi arar ve seçili filmi Düzenleme görünümüne döndürür. yapı iskelesi sistemi Düzenleme görünümünü oluşturduğunda sınıfını inceledi ve sınıfın Movie
her özelliği için ve <input>
öğelerini işlemek <label>
için kod oluşturdu. Aşağıdaki örnek, oluşturulan Düzenleme görünümünü gösterir:
@model MvcMovie.Models.Movie
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Movie</legend>
@Html.HiddenFor(model => model.ID)
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ReleaseDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ReleaseDate)
@Html.ValidationMessageFor(model => model.ReleaseDate)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Genre)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Genre)
@Html.ValidationMessageFor(model => model.Genre)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Görünüm şablonunun dosyanın en üstünde bir @model MvcMovie.Models.Movie
deyimi olduğuna dikkat edin; bu, görünümün görünüm şablonu için modelin türünde Movie
olmasını beklediğini belirtir.
yapı iskelesi oluşturulmuş kod, HTML işaretlemesini kolaylaştırmak için çeşitli yardımcı yöntemler kullanır. Yardımcı, Html.LabelFor
alanın adını ("Title", "ReleaseDate", "Genre" veya "Price") görüntüler. Yardımcı Html.EditorFor
bir HTML <input>
öğesi görüntüler. Yardımcı, Html.ValidationMessageFor
bu özellik ile ilişkili tüm doğrulama iletilerini görüntüler.
Uygulamayı çalıştırın ve /Movies URL'sine gidin. Düzenle bağlantısına tıklayın. Tarayıcıda sayfanın kaynağını görüntüleyin. Sayfadaki HTML aşağıdaki örneğe benzer. (Menü işaretlemesi netlik için dışlandı.)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Edit</title>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>
<body>
<div class="page">
<header>
<div id="title">
<h1>MVC Movie App</h1>
</div>
...
</header>
<section id="main">
<h2>Edit</h2>
<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
<form action="/Movies/Edit/4" method="post"> <fieldset>
<legend>Movie</legend>
<input data-val="true" data-val-number="The field ID must be a number."
data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="4" />
<div class="editor-label">
<label for="Title">Title</label>
</div>
<div class="editor-field">
<input class="text-box single-line" id="Title" name="Title" type="text" value="Rio Bravo" />
<span class="field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="ReleaseDate">ReleaseDate</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-required="The ReleaseDate field is required."
id="ReleaseDate" name="ReleaseDate" type="text" value="4/15/1959 12:00:00 AM" />
<span class="field-validation-valid" data-valmsg-for="ReleaseDate" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="Genre">Genre</label>
</div>
<div class="editor-field">
<input class="text-box single-line" id="Genre" name="Genre" type="text" value="Western" />
<span class="field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="Price">Price</label>
</div>
<div class="editor-field">
<input class="text-box single-line" 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" type="text" value="9.99" />
<span class="field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
</form>
<div>
<a href="/Movies">Back to List</a>
</div>
</section>
<footer>
</footer>
</div>
</body>
</html>
Öğeler<input>
, özniteliği /Movies/Edit URL'sine gönderi olarak ayarlanmış bir HTML <form>
öğesindediraction
. Düzenle düğmesine tıklandığında form verileri sunucuya gönderilir.
POST İsteğini İşleme
Aşağıdaki listede eylem yönteminin Edit
sürümü gösterilmektedirHttpPost
.
[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
ASP.NET framework model bağlayıcısı, gönderilen form değerlerini alır ve parametre olarak movie
geçirilen bir Movie
nesne oluşturur. Koddaki ModelState.IsValid
denetim, formda gönderilen verilerin bir Movie
nesneyi değiştirmek için kullanılabileceğini doğrular. Veriler geçerliyse kod, film verilerini örneğin koleksiyonuna Movies
MovieDBContext
kaydeder. Kod daha sonra veritabanındaki değişiklikleri kalıcı hale getirmek için yöntemini MovieDBContext
çağırarak SaveChanges
yeni film verilerini veritabanına kaydeder. Kod, verileri kaydettikten sonra kullanıcıyı sınıfın Index
MoviesController
eylem yöntemine yönlendirir ve bu da güncelleştirilmiş filmin film listesinde görüntülenmesine neden olur.
Postalanan değerler geçerli değilse, formda yeniden görüntülenir. Html.ValidationMessageFor
Edit.cshtml görünüm şablonundaki yardımcılar uygun hata iletilerinin görüntülenmesini sağlar.
Yerel ayarlar hakkında not Normalde İngilizce dışında bir yerel ayar ile çalışıyorsanız bkz . İngilizce Olmayan Yerel Ayarlarla MVC 3 Doğrulaması ASP.NET Destekleme.
Düzenleme Yöntemini Daha Sağlam Hale Getirme
yapı HttpGet
Edit
iskelesi sistemi tarafından oluşturulan yöntem, geçirilen kimliğin geçerli olup olmadığını denetlemez. Kullanıcı URL' den kimlik kesimini kaldırırsa ()http://localhost:xxxxx/Movies/Edit
aşağıdaki hata görüntülenir:
Kullanıcı, veritabanında mevcut olmayan bir kimliği de geçirebilir, örneğin http://localhost:xxxxx/Movies/Edit/1234
. Bu sınırlamayı gidermek için eylem yönteminde HttpGet
Edit
iki değişiklik yapabilirsiniz. İlk olarak, bir kimlik açıkça geçirilmediğinde parametresini varsayılan sıfır değerine sahip olacak şekilde değiştirin ID
. Ayrıca, film nesnesini görünüm şablonuna Find
döndürmeden önce yönteminin gerçekten bir film bulup bulmadığını de kontrol edebilirsiniz. Güncelleştirilmiş Edit
yöntem aşağıda gösterilmiştir.
public ActionResult Edit(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Film bulunamazsa HttpNotFound
yöntemi çağrılır.
HttpGet
Tüm yöntemler benzer bir desen izler. Bir film nesnesi (veya olması durumunda Index
nesne listesi) alır ve modeli görünüme geçirir. yöntemi, Create
boş bir film nesnesini Oluştur görünümüne geçirir. Verileri oluşturan, düzenleyen, silip veya başka bir şekilde değiştiren tüm yöntemler, yöntemin HttpPost
aşırı yüklemesinde bunu yapar. Http GET yöntemindeki verileri değiştirmek, MVC İpucu #46 ASP.NET blog gönderisi girdisinde açıklandığı gibi bir güvenlik riskidir . Güvenlik Açıkları oluşturdukları için Bağlantıları Sil'i kullanmayın. GET yöntemindeki verilerin değiştirilmesi, HTTP en iyi yöntemlerini ve GET isteklerinin uygulamanızın durumunu değiştirmemesi gerektiğini belirten mimari REST desenini de ihlal eder. Başka bir deyişle, GET işleminin gerçekleştirilmesi, yan etkisi olmayan güvenli bir işlem olmalıdır.
Arama Yöntemi ve Arama Görünümü Ekleme
Bu bölümde, filmleri türe veya ada göre aramanıza olanak tanıyan bir SearchIndex
eylem yöntemi ekleyeceksiniz. Bu, /Movies/SearchIndex URL'si kullanılarak kullanılabilir. İstek, kullanıcının film aramak için doldurabileceği giriş öğelerini içeren bir HTML formu görüntüler. Kullanıcı formu gönderdiğinde, eylem yöntemi kullanıcı tarafından gönderilen arama değerlerini alır ve veritabanında arama yapmak için değerleri kullanır.
SearchIndex Formunu Görüntüleme
Var olan MoviesController
sınıfa bir SearchIndex
eylem yöntemi ekleyerek başlayın. yöntemi HTML formu içeren bir görünüm döndürür. Kod şu şekildedir:
public ActionResult SearchIndex(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
Yöntemin SearchIndex
ilk satırı, filmleri seçmek için aşağıdaki LINQ sorgusunu oluşturur:
var movies = from m in db.Movies
select m;
Sorgu bu noktada tanımlanır, ancak henüz veri deposunda çalıştırılmamıştır.
searchString
Parametresi bir dize içeriyorsa, filmler sorgusu aşağıdaki kod kullanılarak arama dizesinin değerine göre filtre uygulamak üzere değiştirilir:
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
LINQ sorguları tanımlandığında veya veya OrderBy
gibi Where
bir yöntem çağrılarak değiştirildiğinde yürütülür. Bunun yerine, sorgu yürütme ertelenir, yani bir ifadenin değerlendirmesi, gerçekleştirilen değeri gerçekten yinelenene veya yöntem çağrılana ToList
kadar geciktirilir. SearchIndex
Örnekte sorgu SearchIndex görünümünde yürütülür. Ertelenen sorgu yürütme hakkında daha fazla bilgi için bkz. Sorgu Yürütme.
Artık formu kullanıcıya görüntüleyecek görünümü uygulayabilirsiniz SearchIndex
. Yöntemin SearchIndex
içine sağ tıklayın ve ardından Görünüm Ekle'ye tıklayın. Görünüm Ekle iletişim kutusunda, bir Movie
nesneyi görünüm şablonuna model sınıfı olarak geçireceğinizi belirtin. İskele şablonu listesinde Liste'yi seçin ve Ekle'ye tıklayın.
Ekle düğmesine tıkladığınızda Views\Movies\SearchIndex.cshtml görünüm şablonu oluşturulur. yapı iskelesi şablonu listesinde Liste'yi seçtiğinizden, Visual Web Developer görünümde bazı varsayılan içerikleri otomatik olarak oluşturdu (iskelesi oluşturuldu). yapı iskelesi bir HTML formu oluşturdu. sınıfını inceledi ve sınıfın Movie
her özelliği için öğeleri işlemek <label>
için kod oluşturdu. Aşağıdaki listede oluşturulan Oluştur görünümü gösterilmektedir:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "SearchIndex";
}
<h2>SearchIndex</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
Title
</th>
<th>
ReleaseDate
</th>
<th>
Genre
</th>
<th>
Price
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
Uygulamayı çalıştırın ve /Movies/SearchIndex öğesine gidin. URL'ye gibi ?searchString=ghost
bir sorgu dizesi ekleyin. Filtrelenen filmler görüntülenir.
yönteminin imzasını SearchIndex
adlı id
id
bir parametreye sahip olacak şekilde değiştirirseniz, parametre Global.asax dosyasında ayarlanan varsayılan yolların yer tutucusuyla eşleşecektir{id}
.
{controller}/{action}/{id}
Değiştirilen SearchIndex
yöntem aşağıdaki gibi görünür:
public ActionResult SearchIndex(string id)
{
string searchString = id;
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
Artık arama başlığını sorgu dizesi değeri yerine rota verileri (URL segmenti) olarak geçirebilirsiniz.
Ancak, kullanıcıların bir film için her arama yapmak istediklerinde URL'yi değiştirmelerini bekleyemezsiniz. Bu nedenle artık filmleri filtrelemelerine yardımcı olmak için kullanıcı arabirimi ekleyeceksiniz. Yöntemin SearchIndex
imzasını rotaya bağlı kimlik parametresinin nasıl geçirildiğini test etmek için değiştirdiyseniz, yönteminizin SearchIndex
adlı searchString
bir dize parametresi alması için bu parametreyi geri değiştirin:
public ActionResult SearchIndex(string searchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
return View(movies);
}
Views\Movies\SearchIndex.cshtml dosyasını açın ve hemen arkasına @Html.ActionLink("Create New", "Create")
aşağıdakileri ekleyin:
@using (Html.BeginForm()){
<p> Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" /></p>
}
Aşağıdaki örnekte Views\Movies\SearchIndex.cshtml dosyasının eklenen filtreleme işaretlemesiyle bir bölümü gösterilmektedir.
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "SearchIndex";
}
<h2>SearchIndex</h2>
<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm()){
<p> Title: @Html.TextBox("SearchString") <br />
<input type="submit" value="Filter" /></p>
}
</p>
Yardımcı Html.BeginForm
bir açma <form>
etiketi oluşturur. Yardımcı, Html.BeginForm
kullanıcı Filtre düğmesine tıklayarak formu gönderdiğinde formun kendisine göndermesine neden olur.
Uygulamayı çalıştırın ve film aramayı deneyin.
yönteminin SearchIndex
aşırı yüklemesi yokturHttpPost
. Yöntem uygulamanın durumunu değiştirmiyor, yalnızca verileri filtrelediğinden buna ihtiyacınız yoktur.
Aşağıdaki HttpPost SearchIndex
yöntemi ekleyebilirsiniz. Bu durumda, eylem çağırıcı yöntemiyle HttpPost SearchIndex
eşleşecek ve HttpPost SearchIndex
yöntem aşağıdaki görüntüde gösterildiği gibi çalışacaktır.
[HttpPost]
public string SearchIndex(FormCollection fc, string searchString)
{
return "<h3> From [HttpPost]SearchIndex: " + searchString + "</h3>";
}
Ancak, yöntemin SearchIndex
bu HttpPost
sürümünü ekleseniz bile, tüm bunların nasıl uygulandığında bir sınırlama vardır. Belirli bir aramaya yer işareti eklemek veya arkadaşlarınıza tıklayarak aynı filtrelenmiş film listesini görmek için tıklayabilecekleri bir bağlantı göndermek istediğinizi düşünün. HTTP POST isteğinin URL'sinin GET isteğinin URL'si (localhost:xxxxx/Movies/SearchIndex) ile aynı olduğuna dikkat edin; URL'nin kendisinde arama bilgisi yoktur. Şu anda, arama dizesi bilgileri sunucuya form alanı değeri olarak gönderilir. Başka bir deyişle, url'de yer işareti eklemek veya arkadaşlarınıza göndermek için bu arama bilgilerini yakalayamazsınız.
Çözüm, POST isteğinin arama bilgilerini URL'ye eklemesi gerektiğini ve bunun yönteminin HttpGet sürümüne SearchIndex
yönlendirilmesi gerektiğini belirten bir aşırı yükleme BeginForm
kullanmaktır. Mevcut parametresiz BeginForm
yöntemi aşağıdakilerle değiştirin:
@using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))
Artık bir arama gönderdiğinizde URL bir arama sorgusu dizesi içerir. Arama, bir HttpPost SearchIndex
yönteminiz olsa bile eylem yöntemine HttpGet SearchIndex
de gider.
Tarza Göre Arama Ekleme
Yöntemin HttpPost
sürümünü SearchIndex
eklediyseniz şimdi silin.
Ardından, kullanıcıların türe göre film aramasına olanak sağlamak için bir özellik ekleyeceksiniz. SearchIndex
yöntemini aşağıdaki kod ile değiştirin:
public ActionResult SearchIndex(string movieGenre, string searchString)
{
var GenreLst = new List<string>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
if (string.IsNullOrEmpty(movieGenre))
return View(movies);
else
{
return View(movies.Where(x => x.Genre == movieGenre));
}
}
Yöntemin SearchIndex
bu sürümü, adlı movieGenre
ek bir parametre alır. Kodun ilk birkaç satırı, veritabanından film türlerini barındıracak bir List
nesne oluşturur.
Aşağıdaki kod, veritabanından tüm türleri alan bir LINQ sorgusudur.
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
Kod, tüm benzersiz türleri listeye eklemek için genel List
koleksiyonun yöntemini kullanırAddRange
. (Değiştirici olmadan Distinct
yinelenen türler eklenir; örneğin, örneğimizde komedi iki kez eklenir). Kod daha sonra nesnesinde ViewBag
türlerin listesini depolar.
Aşağıdaki kod, parametresinin nasıl denetleneceklerini movieGenre
gösterir. Boş değilse kod, seçili filmleri belirtilen türle sınırlamak için filmler sorgusunu daha da kısıtlar.
if (string.IsNullOrEmpty(movieGenre))
return View(movies);
else
{
return View(movies.Where(x => x.Genre == movieGenre));
}
Türe Göre Aramayı Desteklemek için SearchIndex Görünümüne İşaretlemeyi Ekleme
Views\Movies\SearchIndex.cshtml dosyasına yardımcıdan TextBox
hemen önce bir Html.DropDownList
yardımcı ekleyin. Tamamlanmış işaretleme aşağıda gösterilmiştir:
<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm()){
<p>Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" /></p>
}
</p>
Uygulamayı çalıştırın ve /Movies/SearchIndex konumuna gidin. Türe, film adına ve her iki ölçüte göre arama yapmayı deneyin.
Bu bölümde, çerçeve tarafından oluşturulan CRUD eylem yöntemlerini ve görünümlerini incelediniz. Bir arama eylemi yöntemi oluşturdunuz ve kullanıcıların film başlığına ve türüne göre arama yapmasına olanak sağlayan bir görünüme sahipsiniz. Sonraki bölümde modele özellik Movie
ekleme ve otomatik olarak test veritabanı oluşturacak başlatıcı ekleme adımlarını inceleyeceksiniz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin