MVC视图验证的最佳实践?

时间:2013-10-25 19:12:36

标签: c# asp.net-mvc model-view-controller

以下示例的最佳做法是什么:

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

这三个独立的观点是?或者具有多个路线选项的相同视图?

ActionResult ChangePassword()
ActionResult ChangePassword(string token)
{
// if bad token show this error view partial? set viewdata item and let cshtml decide what to show?
}

或者这样的情况真的不合逻辑吗?

3 个答案:

答案 0 :(得分:3)

我会把它分成两页:

更改密码

  • 用户始终输入旧密码和新密码,新密码两次以进行确认
  • 无需获取用户名,因为他们已经过身份验证
  • 不允许网址参数预先填充值
  • 使用CSRF令牌

重设密码

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

这两个页​​面的运作方式似乎不同,我认为最好使用单独的视图,操作和&amp ;;查看模型。如果你到了最后,重构删除重复没有任何问题,但我预测它们不会像你预期的那样相似。

答案 1 :(得分:2)

我认为你可以使用单个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; }
 }

基于这些属性,您应该拥有充实视图中的表示逻辑以覆盖上述所有用例的所需功能。如果您需要进一步的指导,请告诉我。

答案 2 :(得分:1)

我认为ASP.NET MVC的最佳验证将是您要验证的属性的Validation Attributes