如何处理MVC表单中的隐藏字段?

时间:2011-09-12 01:23:47

标签: asp.net-mvc

我有一个处理不同字段的FormViewModel;其中许多都没有呈现给用户(例如modified_date,current_user_id)所以我使用隐藏字段来尊重FormViewModel结构;提交时,它们被传递给控制器​​的操作并正确保存到数据库但我问:这是ASPNET MVC中最好的方法吗?我宁愿在FormViewModel中定义它们,只使用要修改的字段而不是显示不可修改的隐藏字段。 有没有更好的方法呢?

5 个答案:

答案 0 :(得分:2)

如果用户没有触及这些字段,我会这样做;

创建仅包含相关字段的FormViewModel。也是主键。

主键仍然需要在我认为的页面上。

然后在控制器中接受FormViewModel作为参数,然后加载实际模型并更新,根据需要验证字段并保存模型。

以上是简单的,你会有更多的图层,但你应该明白

答案 1 :(得分:2)

我认为你可以做一些事情让你的生活更轻松:

  • 让URL(和路由机制)为您提供ID(您尝试编辑的主键)

    您可以拥有类似'/ Student / Edit / 1'的网址路由将确保您的Action方法直接获取ID值。

  • 有2种操作方法可以处理您的请求。一个用[HttpGet]装饰,用于将初始表单呈现给用户(您只需从存储库中检索对象并将其传递给View),然后使用[HttpPost]实际处理用户的帖子。

    第二种方法可能类似于:

    [HttpPost] [ActionName( “编辑”)] public ActionResult EditPost(int id){     ......你的代码在这里...... }

  • 根据传入的ID从存储库/存储中检索实际记录。

  • 使用UpdateModel函数将更改应用于数据库记录,并将记录传递回存储库层,以将其存储回数据库。

但是,在现实世界的应用程序中,您可能希望分离关注点并在存储库和视图层之间分离(ASP.NET MVC。)

答案 2 :(得分:1)

如果它们是模型的一部分,那么您使用的方法就完全没问题了。您甚至可以在HtmlHelper.HiddenFor中使用辅助方法为您输出隐藏字段。但是,如果值类似于修改日期或当前用户,则可能更适合将控制器中的值传递到数据层的DTO。不过,我正在对你正在为数据访问做些什么做出一些假设。

答案 3 :(得分:0)

存储不应在隐藏字段中修改的数据的风​​险是可以使用内置/扩展开发人员工具中的浏览器进行修改。发布后,这些更改将保存到您的数据库中(如果您正在处理该操作的方式)。

要保护隐藏字段,您可以使用MVC Security Extensions项目https://mvcsecurity.codeplex.com

说你要保护的字段是Id ...

在你的控制器发布方法上添加:

[ValidateAntiModelInjection("Id")]

在您的视图中添加:

@Html.AntiModelInjectionFor(m => m.Id)
@Html.HiddenFor(m => m.Id)

在发布时,您的Id字段将被验证。

答案 4 :(得分:0)

创建仅包含相关字段的FormViewModel。也是主键。

主键仍然需要在我认为的页面上。

然后在控制器中接受FormViewModel作为参数,然后加载实际模型并更新,根据需要验证字段并保存模型。

以上是简单的,你会有更多的图层,但你应该明白