Arayın
Not
Visual Studio'nun en son sürümünü kullanarak bu öğreticinin güncelleştirilmiş bir sürümüne buradan ulaşabilirsiniz. Yeni öğreticide, bu öğreticide birçok geliştirme sağlayan ASP.NET Core MVC kullanılır.
Bu öğreticide, denetleyiciler ve görünümlerle ASP.NET Core MVC öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı daha kolay ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'de yeni bir alternatiftir. Razor Pages öğreticisini MVC sürümünden önce denemenizi öneririz. Razor Pages öğreticisi:
- Takip etmek daha kolaydır.
- Daha fazla özelliği kapsar.
- Yeni uygulama geliştirme için tercih edilen yaklaşımdı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 eylem yöntemine Index
arama özelliği ekleyeceksiniz.
Önkoşullar
Bu bölümün ekran görüntüleriyle eşleştirmek için uygulamayı (F5) çalıştırmanız ve veritabanına aşağıdaki filmleri eklemeniz gerekir.
Başlık | Yayın Tarihi | Tür | Fiyat |
---|---|---|---|
Ghostbusters | 6/8/1984 | Komedi | 6.99 |
Hayalet Avcıları II | 6/16/1989 | Komedi | 6.99 |
Maymunlar Gezegeni | 3/27/1986 | Eylem | 5,99 |
Dizin Formunu Güncelleştirme
Eylem yöntemini mevcut MoviesController
sınıfa güncelleştirerek Index
başlayın. Kod şu şekildedir:
public ActionResult Index(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 Index
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 veritabanında ç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));
}
Yukarıdaki s => s.Title
kod bir Lambda İfadesi'dir. Lambda'lar yöntem tabanlı LINQ sorgularında yukarıdaki kodda kullanılan Where yöntemi gibi standart sorgu işleci yöntemlerinin bağımsız değişkenleri olarak kullanılır. 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. Search
Örnekte sorgu Index.cshtml 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.
Not
Contains yöntemi, yukarıdaki c# kodunda değil veritabanında çalıştırılır. Veritabanında, BÜYÜK/küçük harfe duyarlı olmayan SQL LIKE eşlemelerini içerir.
Artık formu kullanıcıya gösterecek görünümü güncelleştirebilirsiniz Index
.
Uygulamayı çalıştırın ve /Movies/Index konumuna gidin. URL'ye gibi ?searchString=ghost
bir sorgu dizesi ekleyin. Filtrelenen filmler görüntülenir.
yönteminin imzasını Index
adlı id
id
bir parametreye sahip olacak şekilde değiştirirseniz, parametre App_Start\RouteConfig.cs dosyasında ayarlanan varsayılan yolların yer tutucusuyla eşleşecektir{id}
.
{controller}/{action}/{id}
Özgün Index
yöntem şöyle görünür:
public ActionResult Index(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);
}
Değiştirilen Index
yöntem aşağıdaki gibi görünür:
public ActionResult Index(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 Index
imzasını rotaya bağlı kimlik parametresinin nasıl geçirildiğini test etmek için değiştirdiyseniz, yönteminizin Index
adlı searchString
bir dize parametresi alması için bu parametreyi geri değiştirin:
public ActionResult Index(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\Index.cshtml dosyasını açın ve hemen sonra @Html.ActionLink("Create New", "Create")
aşağıda vurgulanan form işaretlemesini ekleyin:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "Index";
}
<h2>Index</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.
Visual Studio 2013 Görünüm dosyalarını görüntülerken ve düzenlerken iyi bir gelişme sağlar. Uygulamayı bir görünüm dosyası açık olarak çalıştırdığınızda, Visual Studio 2013 görünümü görüntülemek için doğru denetleyici eylem yöntemini çağırır.
Dizin görünümü Visual Studio'da açıkken (yukarıdaki görüntüde gösterildiği gibi), uygulamayı çalıştırmak için Ctr F5 veya F5'e dokunun ve film aramayı deneyin.
yönteminin Index
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 Index
yöntemi ekleyebilirsiniz. Bu durumda, eylem çağırıcı yöntemiyle HttpPost Index
eşleşecek ve HttpPost Index
yöntem aşağıdaki görüntüde gösterildiği gibi çalışacaktır.
[HttpPost]
public string Index(FormCollection fc, string searchString)
{
return "<h3> From [HttpPost]Index: " + searchString + "</h3>";
}
Ancak, yöntemin Index
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/Index) 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 ve yöntemin sürümüne Index
yönlendirilmesi HttpGet
gerektiğini belirten bir aşırı yüklemesi BeginForm
kullanmaktır. Var olan parametresiz BeginForm
yöntemi aşağıdaki işaretlemeyle değiştirin:
@using (Html.BeginForm("Index","Movies",FormMethod.Get))
Artık bir arama gönderdiğinizde URL bir arama sorgusu dizesi içerir. Arama, bir HttpPost Index
yönteminiz olsa bile eylem yöntemine HttpGet Index
de gider.
Tarza Göre Arama Ekleme
Yöntemin HttpPost
sürümünü Index
eklediyseniz şimdi silin.
Ardından, kullanıcıların türe göre film aramasına olanak sağlamak için bir özellik ekleyeceksiniz. Index
yöntemini aşağıdaki kod ile değiştirin:
public ActionResult Index(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))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
Yöntemin Index
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.MovieGenre
türlerin listesini depolar. Kategori verilerinin (film türleri gibi) bir ViewBag
içinde SelectList nesnesi olarak depolanması ve ardından kategori verilerine açılan liste kutusundan erişmesi, MVC uygulamaları için tipik bir yaklaşımdır.
Aşağıdaki kod, parametresinin nasıl denetleneceklerini movieGenre
gösterir. Boş değilse kod, seçilen filmleri belirtilen türle sınırlamak için film sorgusunu daha da kısıtlar.
if (!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
Daha önce belirtildiği gibi, film listesi yinelenene kadar sorgu veritabanında çalıştırılmaz (eylem yöntemi döndürdükten sonra Index
Görünüm'de gerçekleşir).
Türe Göre Aramayı Desteklemek için Dizin Görünümüne İşaretlemeyi Ekleme
Views\Movies\Index.cshtml dosyasına yardımcının TextBox
hemen önüne bir Html.DropDownList
yardımcı ekleyin. Tamamlanmış işaretleme aşağıda gösterilmiştir:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
@using (Html.BeginForm("Index", "Movies", FormMethod.Get))
{
<p>
Genre: @Html.DropDownList("movieGenre", "All")
Title: @Html.TextBox("SearchString")
<input type="submit" value="Filter" />
</p>
}
</p>
<table class="table">
Aşağıdaki kodda:
@Html.DropDownList("movieGenre", "All")
"MovieGenre" parametresi, yardımcının DropDownList
içinde ViewBag
bir IEnumerable<SelectListItem>
bulması için anahtarı sağlar. , ViewBag
eylem yönteminde doldurulmuştu:
public ActionResult Index(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))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
"Tümü" parametresi bir seçenek etiketi sağlar. Bu seçeneği tarayıcınızda incelerseniz, "value" özniteliğinin boş olduğunu görürsünüz. Denetleyicimiz yalnızca dizeyi filtrelediğinden if
veya boş olmadığından null
, için movieGenre
boş bir değer gönderildiğinde tüm türler gösterilir.
Varsayılan olarak seçilecek bir seçenek de ayarlayabilirsiniz. Varsayılan seçeneğiniz "Comedy" olmasını istiyorsanız Denetleyici'deki kodu şöyle değiştirebilirsiniz:
ViewBag.movieGenre = new SelectList(GenreLst, "Comedy");
Uygulamayı çalıştırın ve /Movies/Index konumuna gidin. Türe, film adına ve her iki ölçüte göre arama yapmayı deneyin.
Bu bölümde, kullanıcıların film başlığına ve türüne göre arama yapmasına olanak sağlayan bir arama eylemi yöntemi ve görünümü oluşturdunuz. 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