MVC模型最佳实践 - 如何处理非用户输入数据

时间:2010-10-25 21:07:30

标签: asp.net-mvc model coding-style web-standards

所以,我的问题是我有一个模特。我的模型有一些数据根据通过url传入的id填充并设置为cookie,其余的是用户输入,使用数据注释进行验证。

我遇到的“问题”是如何处理这种非用户输入数据。我是否将它放在隐藏的控件中,从而膨胀(虽然只是略微)我的页面大小,或者我在每个帖子上“重建”模型的那一部分,这增加了数据库的另一次旅行并返回。

我知道这是主观的,但我很好奇标准做法是什么。将数据放在隐藏字段中是最简单的方法,但是,即使在小块中,也只是将视图状态取消后将其取回是不对的。另外,它会将您的数据暴露给用户 - 而不是他们无法调整网址。没有人喜欢不必要的数据库访问。

哦,我不能使用session。此应用程序在负载平衡的环境中运行。

3 个答案:

答案 0 :(得分:2)

将ID留在网址中。一个url应该用来识别资源,所以将参数从url中取出并以任何其他方式存储它只是做额外的工作并使你的url无法识别你正在访问的资源。

如果您需要发送其他数据,通常会在隐藏字段中发送标识符,并像其他任何字段一样对其进行验证。如果您可以推断信息服务器端,那就归结为权衡重建数据与更大请求的成本。您必须在测试期间测量哪种更适合您的应用,但两者在实践中都很常见。当你做出决定时,不要忘记安全问题,而不是所有的表现。

此外,如果数据来自客户端,无论您认为隐藏它的多么聪明,它仍然是用户输入。这意味着即使您没有为它们设置控件来编辑屏幕上的值,一个半精明的用户也会知道如何更改它。

答案 1 :(得分:1)

我不认为视图状态是可行的方式,因为它将内部数据暴露给浏览器,并且还会不必要地增加您的流量。

如果我必须解决这个问题,我会去使用会话来存储这些与会话相关的数据。如果它是负载均衡的环境,那么您将需要分布式会话处理。解决它的最简单方法是启动ASP.NET状态服务并开始使用它来处理会话。

如果您不喜欢Microsoft tech,您还可以使用MemCached在memcached服务器中存储会话数据。有它的提供者,例如this,不幸的是它似乎不再在开发中。

答案 2 :(得分:1)

如果你从每个人的DAL获得它,那将会更好 把不需要的东西放在你的html中是不好的

想象你得到一个用户并将他的密码放在一个隐藏的输入中,只是因为你不想每次都得到它。

或者你把一些东西放在隐藏的输入中并使用 firebug有人改变那些输入的值