ASP.NET MVC 學習八、Controller中的Detail和Delete方法

咱們再來看看自動生成的Details 和Delete methods.web

 MoviesController中的Details方法:數據庫

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

MVC架構引擎(scaffolding engine)建立的action method會在HTTP請求的時候被調用。上面的這個方法在GET請求的時候被調用,URL中會包含三個參數(segments):Movies Controller,Details Method,ID Value.windows

Code First 用Find Method把搜索變得更加簡單。Detail方法中包含一個很重要的安全特性:在沒有找到具體的movie實例前,代碼不會進行任何的處理。瀏覽器

例如,若是hacker直接在把瀏覽器的地址直接由 http://localhost:xxxx/Movies/Details/1更改成http://localhost:xxxx/Movies/Details/1234 這個若是沒有檢查ID對應的Movie實例是否存在,頁面就會報出一個database error安全


MoviesController中的Delete和DeleteConfirme方法:架構

  //
        // GET: /Movies/Delete/5

        public ActionResult Delete(int id = 0)
        {
            Movie movie = db.Movies.Find(id);
            if (movie == null)
            {
                return HttpNotFound();
            }
            return View(movie);
        }

        //
        // POST: /Movies/Delete/5

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

咱們以前也有講到過的,若是ActionResult Method 前不加前綴就默認爲GET請求執行的方法,這個方法不會更新數據庫的數據,只是返回所查詢的數據。咱們點擊「Delete」鏈接的時候(http://localhost:9898/movies/Delete/1),會調用Delete方法查詢到對應Id的數據,而後反饋到頁面中。咱們再次點擊下面的Delete按鈕就會提交一個HTTP POST請求,調用ActionDelete方法。mvc

 

咱們如今看一下,Delete方法和DeleteConfirm方法的區別:asp.net

CLR(common language runtime)請求加載方法的時候,會根據惟一的(unique)方法名和參數調用相應的方法。可是在這裏,咱們須要兩個Delete methods,一個處理GET請求一個處理POST請求,這兩個方法又有相同的參數。spa

 

爲了這兩個Delete方法區分開來,一個解決方法是給這兩個方法不一樣的名字,把POST請求須要調用的Delete方法從新命名爲DeleteConfirme.可是這樣的話,更具默認路由,Delete的URL(http://localhost:9898/movies/Delete/1)請求也就只能調用GET 的 Delete Method,沒法調用重命名的DeleteConfrime Method。爲了解決這個問題,咱們只須要在DeleteConfirme前加上ActionName("Delete") attribute就能夠了。.net

 

小總結:

上面的這些咱們已經創建了一個簡單的CRUD的MVC Application。下一步咱們應該把這個網址發佈。Microsoft 給咱們免費的web hosting 能夠掛10個websites.

地址:free Windows Azure trial account.

相關文章
相關標籤/搜索