Otomatik Olarak Oluşturulan Ayrıntıları ve Silme Yöntemlerini inceleme

tarafından Rick Anderson

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.

Öğreticinin bu bölümünde, otomatik olarak oluşturulan Details ve Delete yöntemlerini inceleyeceksiniz.

Details ve Delete Metotlarını inceleme

Denetleyiciyi Movie açın ve yöntemini inceleyin Details .

Film Denetleyicisi nokta c s sekmesini gösteren ekran görüntüsü. Oluştur açılan menüsünde Ayrıntılar kırmızıyla daire içine alınır.

public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Bu eylem yöntemini oluşturan MVC yapı iskelesi altyapısı, yöntemini çağıran bir HTTP isteğini gösteren bir açıklama ekler. Bu durumda GET , denetleyici, Movies yöntem ve değer olmak üzere üç URL kesimine Details sahip bir ID istektir.

Code First, yöntemini kullanarak Find veri aramayı kolaylaştırır. yönteminde yerleşik olarak bulunan önemli bir güvenlik özelliği, kodun, kodla bir şey yapmaya çalışmadan önce yöntemin bir film bulduğunu doğrulamasıdır Find . Örneğin, bir bilgisayar korsanı bağlantılar http://localhost:xxxx/Movies/Details/1 tarafından oluşturulan URL'yi (veya gerçek bir filmi temsil etmeyen başka bir değer) olarak http://localhost:xxxx/Movies/Details/12345 değiştirerek siteye hata verebilir. Null film olup olmadığını denetlemediyseniz, null film veritabanı hatasına neden olur.

Delete ve DeleteConfirmed yöntemlerini inceleyin.

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

HTTP GET Delete yönteminin belirtilen filmi silmez, silme işlemini gönderebileceğiniz (HttpPost) filmin bir görünümünü döndürdüğünü unutmayın. BIR GET isteğine yanıt olarak silme işlemi gerçekleştirmek (veya bu nedenle, bir düzenleme işlemi gerçekleştirmek, işlem oluşturmak veya verileri değiştiren başka bir işlem) bir güvenlik deliği açar. Bu konuda daha fazla bilgi için Bkz. Stephen Walther'ın blog girdisi ASP.NET MVC İpucu #46 — Güvenlik Açıkları oluşturdukları için Bağlantıları Sil'i kullanmayın.

Verileri HttpPost silecek yöntem, HTTP POST yöntemine benzersiz bir imza veya ad vermek için adlandırılır DeleteConfirmed . İki yöntem imzası aşağıda gösterilmiştir:

// GET: /Movies/Delete/5
public ActionResult Delete(int? id)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

Ortak dil çalışma zamanı (CLR), aşırı yüklenmiş yöntemlerin benzersiz bir parametre imzasına (aynı yöntem adı ama farklı parametre listesi) sahip olmasını gerektirir. Ancak burada biri GET ve diğeri POST için olmak üzere iki Delete yöntemi gerekir ve her ikisi de aynı parametre imzasını kullanır. (Her ikisinin de parametre olarak tek bir tamsayı kabul etmeleri gerekir.)

Bunu çözmek için birkaç şey yapabilirsiniz. Bunlardan biri, yöntemlere farklı adlar vermektir. Yapı iskelesi mekanizması önceki örnekte bunu yapmıştır. Bununla birlikte, bu küçük bir soruna neden olur: ASP.NET URL'nin segmentlerini eylem yöntemlerine ada göre eşler ve bir yöntemi yeniden adlandırırsanız yönlendirme normalde bu yöntemi bulamaz. Çözüm, örnekte gördüğünüz yönteme özniteliğini DeleteConfirmed eklemektirActionName("Delete"). Bu, yönlendirme sistemi için eşlemeyi etkili bir şekilde gerçekleştirir, böylece POST isteği için /Delete/ içeren bir URL yöntemini bulur DeleteConfirmed .

Aynı adlara ve imzalara sahip yöntemlerle ilgili bir sorundan kaçınmanın bir diğer yaygın yolu, KULLANıLMAYAN bir parametreyi içerecek şekilde POST yönteminin imzasını yapay olarak değiştirmektir. Örneğin, bazı geliştiriciler POST yöntemine geçirilen bir parametre türü FormCollection ekler ve ardından parametresini kullanmaz:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Özet

Artık verileri yerel veritabanı veritabanında depolayan eksiksiz bir ASP.NET MVC uygulamanız var. Film oluşturabilir, okuyabilir, güncelleştirebilir, silebilir ve arama yapabilirsiniz.

M V C Film Arama Dizini sayfasını gösteren ekran görüntüsü.

Sonraki Adımlar

Bir web uygulaması oluşturup test ettikten sonra, bir sonraki adım uygulamayı İnternet üzerinden diğer kişilerin kullanımına açmaktır. Bunu yapmak için bir web barındırma sağlayıcısına dağıtmanız gerekir. Microsoft, ücretsiz bir Azure deneme hesabında en fazla 10 web sitesi için ücretsiz web barındırma hizmeti sunar. Daha sonra Öğreticimi izlemenizi öneririm. Azure'a Üyelik, OAuth ve SQL Veritabanı ile Güvenli ASP.NET MVC uygulaması dağıtma. Tom Dykstra'nın ASP.NET MVC Uygulaması için ara düzey Entity Framework Veri Modeli Oluşturma öğreticisi mükemmel bir öğreticidir. Stackoverflow ve ASP.NET MVC forumları , soru sormak için harika bir yerdir. En son öğreticilerimle ilgili güncelleştirmeleri almak için twitter'da beni takip edin.

Geri bildirim kabul edilir.

Rick Anderson twitter: @RickAndMSFT
Scott Hanselman twitter: @shanselman