MVC 5 - 查询Details和Delete方法

系统 1736 0

MVC 5 - 查询Details和Delete方法

在这部分教程中,接下来我们将讨论自动生成的Details和Delete方法。

查询Details和Delete方法

打开Movie控制器并查看Details方法。

clip_image002

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

}
      
    

MVC scaffolding引擎增加了一个注释表明,在调用的HTTP请求方法中,GET请求有三个URL段,Movies控制器,Details方法和ID值。

Code First 使得您可以轻松的使用 Find 方法来搜索数据。一个重要的安全功能内置到了方法中。方法首先验证 Find 方法已经找到了一部电影,然后再执行其它代码。例如,黑客可以通过更改 http://localhost:xxxx/Movies/Details/1 http://localhost:xxxx/Movies/Details/12345  (或某些其它值,不代表实际影片的值)从而使得链接URL 出现错误。如果您没有检测是否找到了Movie, null Movie会导致出现数据错误。

查看 Delete DeleteConfirmed 方法。

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



}
      
    

请注意, Delete HTTP Get  方法不会删除指定的电影,它返回删除电影的视图,您可以在此视图中提交 ( HttpPost ) 删除电影。如果使用GET 请求执行删除操作(或者执行编辑操作,创建操作或者更改数据的任何其它操作) 开辟了一个安全漏洞。对此的详细信息,请参阅斯蒂芬 · 瓦尔特的博客 ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes .

将删除数据的 HttpPost 方法命名为唯一签名或名称的  DeleteConfirmed  方法。这两个方法的签名如下所示:

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




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

[HttpPost, ActionName(
      
      
        "
      
      
        Delete
      
      
        "
      
      
        )]




      
      
        public
      
       ActionResult DeleteConfirmed(
      
        int
      
       id)
    

公共语言运行时 (CLR)重载方法时,需要方法具有独特唯一的签名 (方法名称相同但不同的参数列表)。但是,在这里您需要两种删除方法 — — 一个 GET方法和一个POST方法它们都具有相同的签名。(他们都需要接受一个整数作为参数)。

要解决这一点,可以有几种办法。一是使用不同的方法名称。这是框架代码在前面的示例中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL按名称映射到操作方法,如果您重命名了方法,通常Routing将无法找到该方法。解决方法是您在示例中看到的,将 ActionName("Delete") 属性添加到 DeleteConfirmed  方法。这会有效的执行Routing系统的Url映射,这样一个包含 /Delete/ 的 POST 请求的URL 将找到 DeleteConfirmed  方法。

另一个常见的方法,来避免具有相同名称和签名的方法,是人为地改变POST 方法,包括未使用参数的签名。例如,有些开发人员添加参数类型  FormCollection 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 应用程序并在本地的 DB 数据库中存储数据。您可以创建、 读取、 更新、 删除和搜索电影。

clip_image004

下一步

在您构建和测试一个Web应用程序之后,下一步就是将其提供给其他人,以使得通过互联网访问。要做到这一点,你需要将它部署到一个Web主机。 如通过微软的 free Windows Azure trial account ,您可以部署多达10个Web站点。我建议你​​下一步请按照我的教程 Deploy a Secure ASP.NET MVC app with Membership, OAuth, and SQL Database to a Windows Azure Web Site ,以更深入了解如何部署。另外,还有一个很好的教程是Tom Dykstra's的中级的 Creating an Entity Framework Data Model for an ASP.NET MVC Application Stackoverflow  和  ASP.NET MVC forums

提出问题的好地方:StackOverflow的ASP.NET MVC的论坛或者 GCDN的Web软件开发讨论区 。请关注 我们的博客 ,这样你就可以获得最新教程的更新信息流。

任何意见,欢迎反馈。

 
 
分类:  Web技术

MVC 5 - 查询Details和Delete方法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论