视图验证的MVC最佳做法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视图验证的MVC最佳做法?相关的知识,希望对你有一定的参考价值。

以下示例被认为是最佳实践:

  • 更改密码-正常,输入用户名,当前密码,新密码,确认密码
  • 更改密码-密码恢复,电子邮件具有转到此页面的链接,发送一个参数,其中包含用户名和新系统更改的密码,视图仅显示新密码并确认密码。
  • 更改密码-上面的链接包含无效的参数,表明此链接已损坏

这是3个单独的视图吗? 还是具有多个路线选项的同一视图?

ActionResult ChangePassword()
ActionResult ChangePassword(string token)

// if bad token show this error view partial? set viewdata item and let cshtml decide what to show?

还是这样的情况不是真的那么合乎逻辑吗?

答案

我将其分为2页:

更改密码

  • 用户总是输入旧密码和新密码,两次输入新密码进行确认
  • 无需获取用户名,因为它们应该已经通过身份验证
  • 不允许URL参数预填充值
  • 使用CSRF令牌

重设密码

  • 仅链接到具有有效唯一参数的电子邮件
  • 用户仅输入新密码,两次进行确认
  • 无需获取用户名,通过电子邮件设置的URL参数已经可以识别用户
  • 不要使用URL参数发送其他任何内容,例如临时密码或用户名
  • 无需使用CSRF令牌,其他唯一参数已阻止伪造

这两页的操作方式似乎完全不同,我认为最好使用单独的视图,操作和视图模型。 如果最后,重构消除重复没有什么问题,但是我预计它们不会像您期望的那样相似。

另一答案

我认为您可以只使用一个View,只需要构建足够强大的ViewModel:

 public class ChangePasswordViewModel()
     public string OldPasswordHash get; set; //Remember never to store password in clear text
     public string NewPassword get; set; 
     public string RecoveryToken  get; set; 
 

基于这些属性,您应该拥有充实视图中表示逻辑的所有内容,以掩盖您上面描述的所有用例。 让我知道您是否需要进一步的指导。

另一答案

我认为对ASP.NET MVC的最佳验证是您要Validation Attributes上的“ Validation Attributes ”。

以上是关于视图验证的MVC最佳做法?的主要内容,如果未能解决你的问题,请参考以下文章

基于动作的验证最佳实践 Spring MVC

最佳实践 - 从视图访问域对象列表?

每个视图都有单独的knockout js文件

添加视频背景视图的最佳做法是啥?

ios身份验证的最佳做法和教程

身份验证站点中的Django缓存:最佳做法