我将问题记录为here和here以及here和especially here,其中,在ASP.NET MVC4视图中,html辅助函数@Html.HiddenFor(m => m.ID)
将使用“错误”数据并导致数据损坏。
这是一个大问题,而公认的“解决方案”就是简单地意识到这一点并围绕它进行设计。我认为这是一个糟糕的解决方案。 (顺便说一下,我们使用类似的东西:<input type="hidden" value="@Model.ID" />
)
每隔几个月,我或同事就会忘记并使用那个html助手,在我们再次追查问题之前,一切都会崩溃。
如何消除此功能的使用,以避免将来出现错误?
- 这不是我们的代码,因此我们无法用[Obsolete]
标记它
- 我们可以覆盖HtmlHelper
,但这只是消除一个功能的很多工作
- 我可以编写单元测试来从视图中选择此代码吗?(如果检测到该调用则进行失败测试)
- 其他想法?
答案 0 :(得分:3)
这不是一个“问题”,它是所谓的工作方式。并且它不仅仅是HiddenFor,每个助手都会这样做。这是MVC设计工作的方式。您似乎不了解MVC如何工作的事实是真正的问题。
这是ModelState子系统的一部分,你明智地知道它是如何工作的。是的,它并不总是直观的,但实际上你知道事情是如何工作的,而不是假装它们不存在,这要好得多,因为你最终会以其他方式与其他助手咬伤。
但是,如果你另有选择,我建议配置StyleCop来处理这个问题
答案 1 :(得分:1)
如果您需要一些静态分析工具,我可以通过CodeContracts查看 Visual Studio Gallery +还有其他工具(付费,就像我所知道的那样)。
主要思想是:在代码中定义via属性条件,并在二进制生成之前验证条件,或者在运行时通过调用关联方法。 但考虑到您不允许或无法更改使用该功能的代码的事实,可能是
Roslyn会更适合你。因此,您可以调查AST
并查看是否对该非理想函数进行了一些调用。
注意:取决于架构,它可能会成为相当复杂的问题,但是,顺便说一下,这些是您可以考虑使用的选项。
答案 2 :(得分:0)
我不确定这是否有帮助,但我在代码中删除HiddenFors所做的是实现一种ViewState。该模型被序列化到客户端,我的模型绑定器被设置为反序列化。我在https://github.com/willseitz/ModelViewState处提出了代码。这可能有助于您提出一般解决方案。
答案 3 :(得分:0)
Erik是对的,它应该在执行HTTP POST时工作。这是一个很好的解释:Blog link。该博客提出了几个解决方案,包括你的Bobby B: - )
来自博客的引用: “ASP.NET MVC假设如果您在回复HTTP POST时呈现View,并且您正在使用Html Helpers,那么您最有可能重新显示验证失败的表单。因此,Html Helpers实际上在ModelState中查看在模型中查看之前在字段中显示的值。这使它们能够重新显示用户输入的错误数据,并在需要时重新显示匹配的错误消息。 ... Html Helpers(即Html.Hidden和Html.TextBox)首先检查ModelState ......然后显示操作接收的值,而不是我们修改过的值。“
感谢nemesv和Rhys Stephens(stackoverflow link)