2009-11-18 89 views
1

以下是这种情况:当新用户注册到我们的网站时,我们想发送一封电子邮件来验证用户是否拥有该电子邮件地址。在电子邮件中有一个页面的链接,将做验证,像这样:ASP.NET MVC:以相同的方法使用GET和POST

http://www.mysite.com/account/verify/token

的验证方法是这样的:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Verify(Nullable<Guid> id) 
{ 
    // tries to get the user based on the verification code 
    if (ValidId(id)) 
    { 
     // if the id is correct, update user data in the model and redirect 
     return RedirectToAction("Index", "Dashboard"); 
    } 
    else 
    { 
     // redirects the user to the verify view 
     return View("Verify"); 
    } 
} 

“验证”视图是一个简单的带有按钮的文本框,因此用户可以手动输入验证码(用户可以从该站点访问此页面,并且可能更喜欢只复制粘贴代码)。当用户点击按钮时,我想要做与我的GET方法一样的事情;所以我结束了这样的事情:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
public ActionResult Verify(Nullable<Guid> id) { ... } 

我有几个问题与此代码(其中工程,但...):

  • 是否确定有GET和POST方法?或者有更好的方法来处理这种情况?
  • 我正在修改GET方法中的数据(如果ID是正确的,我更新用户数据以反映它已经过验证)并且这是一个很大的否NO ...我仍然希望用户能够点击链接并验证令牌。有没有更好的方法来实现这一目标?

感谢

+0

__Verrify__视图可以使用JS从窗体中获取请求,因此您不会有单独的操作。没有? – Amirshk 2009-11-18 02:20:48

回答

1

我个人不会打扰AcceptVerbs属性。 (**请参阅下面的注释)然后,您可以将其合并为一个操作,并根据需要进行响应。 (下面显示了一些未经测试的代码。)我添加答案而不仅仅是评论的原因是,我想建议您为逻辑添加一个分支,以处理失败的代码(即提供错误消息) 。

public ActionResult Verify(Nullable<Guid> id) 
{ 
    if (!id.HasValue) 
    { 
     // nothing was submitted 
     ViewData["message"] = "Please enter your ID and press Submit"; 
     return View("Verify"); 
    } 
    if (!ValidId(id)) 
    { 
     // something was submitted, but wasn't valid 
     ViewData["message"] = "ID is invalid or incomplete. Pleaes check your speeling"; 
     return View("Verify"); 
    } 
    // must be valid 
    return RedirectToAction("Index", "Dashboard"); 

} 

然后,您当然可以在验证视图中显示<%=ViewData["message"]%>。这当然只是一个简单的例子。

**好了,这里是我的笔记RE:不与AcceptVerbs属性烦心事:
在你的情况,你也可以只选择使你的窗体的方法GET代替POST。因为您已经在“采取行动”并修改用户点击的便捷链接上的状态,所以我不会看到任何区别。即使我亲自选择我以前的建议,我只是提到这是彻底的。

祝你好运!

+0

谢谢..这似乎是正确的方式..我很高兴我没有离开这里:) – 2009-11-18 15:16:29

+0

这是一个很好的方法,如果你的控制器很轻,但如果你的控制器变大,那么它可以成为一个噩梦,我个人从来没有使用过这种类型的所有强大的控制器,它闻起来有风险。 – JOBG 2009-11-18 21:04:53

0

我不得不说,这是很少发现有人这么关心使用正确的HTTP动词。我不相信HTTP规范的初衷是将所有数据编辑提交限制在POST和所有的GET检索。我认为你在做什么就好。

+0

谢谢..看来我真的很担心我不需要的地方。我感谢你的时间! – 2009-11-18 15:17:01

1

我在一个GET方法修改数据......这是一个很大的NO NO

我不会说这总是一个很大的不,不。 HTTP表示GET方法“应该”是“安全的”,也就是说除了信息检索之外,它应该没有效果。在这种情况下,我认为将“安全”的定义扩展为没有任何有害的副作用是合理的,并且实际上验证链路可能具有的唯一可能的副作用是理想的副作用。

GET方法应该具有的其他属性是幂等性的:如果用户多次单击验证链接,就好像他们只点击一次一样。希望您拥有此属性,因为验证链接是使用一次性代码生成的。

+0

yeap ..它是一次性使用代码..所以我很好。谢谢! – 2009-11-18 15:17:37

-1

如果你担心它,那么这有什么问题?

 [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Verify() 
    { 
     return View("Verify"); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Verify(Guid? id) 
    { 
     if (ValidId(id)) 
     { 
      return RedirectToAction("Index", "Dashboard"); 
     } 

     return View("Verify"); 
    } 
相关问题