基于另一个问题: Creating a Child object in MVC4 - Parent's information not being passing to Create() controller
MVC 是否提供了一种机制来将数据从 HttpGet Create() 发送到 HttpPost Create() 而无需通过客户端?如果我需要将一些对客户端无意义的数据发送到 Post 方法,我如何避免混乱的视图和过度暴露模型属性给潜在的攻击者?
基于另一个问题: Creating a Child object in MVC4 - Parent's information not being passing to Create() controller
MVC 是否提供了一种机制来将数据从 HttpGet Create() 发送到 HttpPost Create() 而无需通过客户端?如果我需要将一些对客户端无意义的数据发送到 Post 方法,我如何避免混乱的视图和过度暴露模型属性给潜在的攻击者?
您的 GET 和 POST 操作只是类上的方法。如果您唯一关心的是在某些条件下执行代码块,那么听起来确实没有任何理由在这里使用 POST。
更改您的 POST(删除属性)并使其成为私有方法,以便客户端无法访问。在您的 GET 中,执行您需要执行的任何检查,然后调用该方法。
如果您确实需要公开 POST,请将相关代码重构为一个单独的私有方法,您可以从 GET 或 POST 调用该方法。更好的实现将是一个单独的类,该类的方法位于该类以用于重用/测试/SoC。
如果您在这里使用数据库,请注意......虽然在 GET 期间有一些正当理由写入数据库,但请注意,在大多数情况下,这不是 GET 的幂等性质(http://www. w3.org/Protocols/rfc2616/rfc2616-sec9.html)。
干杯。
是的 - 正如我在另一个答案中提到的,您可以使用 TempData - 但是您不需要这个。您只使用实体中的 id 和名称,只传递视图模型中的那些。您不需要完整的实体。在服务器端确保您的用户可以访问这些记录。例如,如果我正在编辑客户记录,我会确保当前用户可以通过以下方式访问:
var currentUsersCompanyId = GetCurrentUserCompanyId();
ctx.Customers.Single(o=>o.CustomerId = customerId and currentUsersCompanyId == customerId)
根据您控制权限的方式,有多种方法可以做到这一点 - .net 的第三方平台(如 Apprenda)有助于在幕后更自动地做到这一点。