zoukankan      html  css  js  c++  java
  • 【译】ASP.NET MVC 5 教程

    在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法。

    Details 方法

    打开Movie控制器,找到Details方法。

    //
    // GET: /Movies/Details/5
    public ActionResult Details(Int32 id)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
            return HttpNotFound();
        }
        return View(movie);
    }

    Code First 通过使用Find方法找到要显示的Movie对象。如果movie对象为null,则返回HttpNotFound(),这个判断非常有必要,试想如果有黑客要攻击你的网站,他们可能将通过修改URL来尝试访问你的网站,例如将http://localhost:xxxx/Movies/Details/1 修改为http://localhost:xxxx/Movies/Details/12345 。如果你不去验证movie是否为空,则会将数据库错误返回给黑客,这样会暴漏网站的更多信息。

    Delete 和 DeleteConfirm 方法

    //
    // GET: /Movies/Delete/5
    public ActionResult Delete(Int32 id)
    {
        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(Int32 id)
    {
        Movie movie = db.Movies.Find(id);
        db.Movies.Remove(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    第一个Delete方法并没有删除Movie,而是返回了可以删除确认页面,在确认页面中,会创建HttpPost请求,完成Movie的删除。直接使用HttpGet 请求来删除Movie会打开一个安全漏洞。

    真正删除数据的方法名字是 DeleteConfirmed。下面是两个方法的定义:

    public ActionResult Delete(Int32 id)
    
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(Int32 id)

    CLR对于重构的方法,要求方法名相同,但参数不同。然而,我们在这里用到的两个删除方法,他们都接收一个整形的参数,如果方法名也形同,那么就构成语法错误了。

    为了解决这个问题,有以下几种解决办法:

    第一种办法是使用不同的方法名。这也是ASP.NET MVC 5 支架所采用的方法。然而,使用这种方法还有一些小问题:ASP.NET 通过地址段来映射方法名,如果将方法重命名,路由通常会找不到方法,解决的办法已经在上面的例子中了,我们可以为DeleteConfirmed方法添加特性ActionName("Delete")。这样一来,当URL中包含Delete 的POST请求都会被分配给方法DeleteConfirmed。

    另外一种常用解决的方法是使用相同的名字,然后为POST 方法添加一个未使用的参数。例如,一些开发者会添加FormCollection类型的参数传递给POST方法,然后不使用这个参数:

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

    总结

    现在你已经拥有了一个完整的ASP.NET MVC 5 应用程序,你可以使用LocalDB来存储数据,可以新建、编辑、查找、删除 Movie数据。

    最后

    本教程就先到这里,翻译上或多或少会有些错误的地方,希望大家及时指正,更希望这些文字能给予大家一定的帮助,我们共同努力,共同进步……

  • 相关阅读:
    依赖注入
    微服务下的安全方案
    VS2019 社区版(community) 离线版本 解决“试用30天过期”步骤
    webpack4升级webpack5
    Ubuntu 上 Node.js 安装和卸载
    记录一次使用locust压测的过程
    大厂面试通关指南,已拿腾讯,阿里offer(附100+最新大厂真题)
    通过自己整理和刷题三个月成功入职腾讯,皇天不负有心人啊!!
    不懂就问系列,为什么别人能靠这份面试题宝典去大厂?(内附面试题答案)
    整理了3家面试问题:美团+字节+腾讯,个个三面,你认为你能走到哪一面?
  • 原文地址:https://www.cnblogs.com/DoduNet/p/3226528.html
Copyright © 2011-2022 走看看