Aracılığıyla paylaş


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ü kullanılarak bu öğreticinin güncelleştirilmiş bir sürümü burada kullanılabilir. Yeni öğreticide, bu öğretici üzerinde birçok geliştirme sağlayan ASP.NET Core MVC ağlanmaktadır.

Bu öğreticide ASP.NET Core MVC'ye denetleyiciler ve görünümler öğretildi. Razor Pages, web kullanıcı arabirimi oluşturmayı kolaylaştıran ve daha üretken hale getiren sayfa tabanlı bir programlama modeli olan ASP.NET Core'daki 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 iskele altyapısı, yöntemini çağıran bir HTTP isteğini gösteren bir açıklama ekler. Bu durumda GET , denetleyici, yöntem ve değer olmak Movies ü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 gibi http://localhost:xxxx/Movies/Details/12345 bir değere (veya gerçek bir filmi temsil etmeyen başka bir değere) değiştirerek siteye hata verebilir. Null film olup olmadığını denetlemediyseniz, null bir 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 silmediğini, silme işlemini gönderebileceğiniz (HttpPost) filmin bir görünümünü döndürdüğünü unutmayın. GET isteğine yanıt olarak silme işlemi gerçekleştirmek (veya bu nedenle, 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.

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, diğeri POST için olmak üzere iki Delete yöntemine ihtiyacınız vardır 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. Önceki örnekte yapı iskelesi mekanizması bunu yapmıştır. Ancak bu küçük bir sorun oluşturur: ASP.NET URL'nin kesimlerini 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, bir POST isteği için /Delete/ içeren bir URL'nin yöntemini bulması için yönlendirme sistemi için eşlemeyi DeleteConfirmed etkili bir şekilde gerçekleştirir.

Aynı adlara ve imzalara sahip yöntemlerle ilgili bir sorundan kaçınmanın bir diğer yaygın yolu da POST yönteminin imzasını yapay olarak kullanılmayan bir parametre içerecek şekilde 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 arayabilirsiniz.

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, 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 alabilmeniz için twitter'da beni takip edin.

Geri bildirim kabul edilir.

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