我有一个处理不同字段的FormViewModel;其中许多都没有呈现给用户(例如modified_date,current_user_id)所以我使用隐藏字段来尊重FormViewModel结构;提交时,它们被传递给控制器的操作并正确保存到数据库但我问:这是ASPNET MVC中最好的方法吗?我宁愿在FormViewModel中定义它们,只使用要修改的字段而不是显示不可修改的隐藏字段。 有没有更好的方法呢?
答案 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作为参数,然后加载实际模型并更新,根据需要验证字段并保存模型。
以上是简单的,你会有更多的图层,但你应该明白