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 OrderBygibi 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.

SearchQryStr

yönteminin imzasını Index adlı idid 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.

M V C Film Dizini sayfasını gösteren ekran görüntüsü. Yerel konak iki nokta üst üste 1 2 3 4 eğik çizgi Filmler eğik çizgi dizin eğik çizgi hayaletI R L alanında ve kırmızı daire içindedir.

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ı searchStringbir 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 noktası c s h t m l sekmesini gösteren ve açık Çözüm Gezgini gösteren ekran görüntüsü. Çözüm Gezgini'da Filmler alt klasörü açık ve Index dot c s h t m l seçilidir.

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.

Başlık alanına bir başlık girilmiş Dizin sayfasını gösteren ekran görüntüsü.

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>"; 
}

SearchPostGhost

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))

BeginFormPost_SM

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.

IndexWithGetURL

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ı movieGenreek 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 ViewBagiç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 ViewBagbir 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.

Dizin sayfasını gösteren ekran görüntüsü. Bir tür seçilir.

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.