0

我在此处此处此处记录了问题,尤其是在此处,在 ASP.NET MVC4 视图中,html 帮助器函数@Html.HiddenFor(m => m.ID)将使用“错误”数据并导致数据损坏。

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

每隔几个月,我或一位同事就会忘记并使用那个 html 帮助程序,在我们追查问题之前,一切都崩溃了……再一次。

我怎样才能避免使用这个功能,以避免将来出错?
- 这不是我们的代码,所以我们不能标记它[Obsolete]
- 我们可以覆盖HtmlHelper,但是为了消除一个功能需要做很多工作
-我可以编写一个单元测试来从视图中挑选出这段代码吗?(如果检测到该呼叫,则测试失败)
- 其他想法?

4

4 回答 4

3

这不是一个“问题”,而是它应该工作的方式。而且不只是 HiddenFor 会这样做,每个助手都会这样做。这就是 MVC 设计的工作方式。您似乎不了解 MVC 的工作原理是真正的问题。

这是 ModelState 子系统的一部分,您最好知道它是如何工作的。是的,这并不总是直观的,但你实际上知道事情是如何运作的比假装它们不存在要好得多,因为你最终会以其他方式被其他帮助者咬伤。

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

于 2013-04-18T15:47:17.377 回答
1

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

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

罗斯林会更适合你。所以你可以调查你的AST,看看是否有一些关于那个不受欢迎的功能的调用。

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

于 2013-04-18T15:45:50.887 回答
0

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

于 2013-05-01T14:26:10.057 回答
0

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

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

感谢 nemesv 和 Rhys Stephens(stackoverflow 链接

于 2015-09-04T11:51:25.963 回答