防止使用 MVC 的 HiddenFor 函数



我有问题记录在这里,这里和这里,特别是这里,在一个ASP。. NET MVC4视图,html辅助函数@Html.HiddenFor(m => m.ID)将使用"错误"的数据,并导致数据损坏。

这是一个巨大的问题,公认的"解决方案"是简单地意识到这一点并围绕它进行设计。我认为这是一个糟糕的解决方案。(顺便说一下,我们使用这样的东西:<input type="hidden" value="@Model.ID" />)

每隔几个月,我或我的同事就会忘记使用html帮助器,在我们找到问题之前,一切都乱套了……一次。

如何消除这个函数的使用,以避免将来出现错误?
-这不是我们的代码,所以我们不能用[Obsolete]
标记-我们可以覆盖HtmlHelper,但这是大量的工作,只是为了消除一个函数
- 我可以写一个单元测试从视图中挑选出这段代码吗?(如果检测到调用,则测试失败)
-还有其他想法吗?

这不是一个"问题",这是应该工作的方式。不只是HiddenFor这么做,每个助手都会这么做。这是MVC设计的工作方式。事实上,你似乎不理解MVC是如何工作的才是真正的问题。

这是ModelState子系统的一部分,您最好确切地知道它是如何工作的。是的,它并不总是直观的,但是你真正知道事物是如何工作的比假装它们不存在要好得多,因为你最终会以其他方式与其他助手一起被咬。

但是,如果您选择其他方式,我建议配置StyleCop来处理这个问题

如果你想要一些静态分析工具,你可以看看CodeContractsVisual Studio Gallery +还有其他工具(据我所知,是付费的)。

主要思想是:在代码中通过属性定义条件,这些条件在二进制生成之前或在运行时通过调用相关方法进行验证。但是考虑到您不允许或不能更改使用该函数的代码,可能是

Roslyn更适合你。因此,您可以调查您的AST并找出是否有一些对不理想的函数的调用。

注意:取决于架构,这可能会成为相当复杂的问题,但是,顺便说一下,这些都是你可以考虑的选项。

我不确定这是否会有所帮助,但是我在代码中删除HiddenFors所做的是实现一种ViewState。模型被序列化到客户端,我的模型绑定器被设置为反序列化。我把代码放到了https://github.com/willseitz/ModelViewState。这可能会帮助你想出一个通用的解决方案。

Erik是对的,在做HTTP POST时应该这样工作。这里有一个很好的解释:博客链接。该博客提出了几种解决方案,包括你的Bobby B:-)

引用自博客:"ASP。. NET MVC假定,如果您正在呈现一个视图以响应HTTP POST,并且您正在使用Html helper,那么您很可能会重新显示一个验证失败的表单。因此,在查看Model之前,Html helper实际上会先在ModelState中检查要在字段中显示的值。这使它们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。…Html helper(即Html。Hidden和Html.TextBox)首先检查ModelState,因此显示操作接收到的值,而不是我们修改的值。"

感谢nemesv和Rhys Stephens (stackoverflow link)

最新更新