在asp.net MVC3网页中切换经过身份验证的视图和匿名视图的最佳方法是什么?

时间:2012-02-14 08:15:18

标签: asp.net asp.net-mvc asp.net-mvc-3 razor

我一直在玩MVC3一段时间,我正在考虑将我学到的东西用于现在并使用它来敲开一个真正的项目,但有一件事我从未真正看清楚解释或演示,并希望我能从这里得到社区的一些反馈。问题是,如果您的页面可以处于两种状态,具体取决于访问者是否经过身份验证,我应该使用哪种技术在两种状态之间切换?每个页面应该有两个完全独立的视图和两个视图共有的共享模型,还是最好用部分视图来控制登录或匿名元素之间的差异?或者更好的是有两个不同的模型和两个不同的视图,然后在控制器阶段在它们之间切换?

我可以看到很多不同的方式,我可以实现它但我从来没有真正看到任何关于最佳实践方式的例子或建议,我还没有建立一个项目足够大,还可以作为实验室找到困难的方法,尽管这就是我即将开始的。

有没有人有任何故事要讲述他们的方式?即使“不要这样做”也只是为了减少一些选项。

我之所以要问的是,我想建立一个并非完全残废的网站,直到您登录并注册,当您无法通过网站的主页时,它会让我感到疯狂注册过程所以我希望能够提供每个页面的“Lite”版本,即使访问者未经过身份验证也没有用户特定的内容,然后在登录时向页面添加额外的功能。

我可以看到关于同一主题的其他问题,但它们似乎都与iOS开发有关,所以如果之前已经问过这个问题而道歉,但是我看不到任何回答我问题的内容。

反馈表示赞赏,我很想听听哪些有效,哪些对其他人无效。

编辑:一种不那么模糊的提问方式。

在我的主页上,我在右上角有一个用户名/密码框,其中有一个“登录”按钮和主页中间的一段文字。当用户输入他们的用户名&密码和命中提交我希望“登录”控件更改为“欢迎:{username}”消息和注销按钮,我希望主页上的文本段切换到“已验证”消息。我不知道在哪里对页面结构进行这些更改,这两个视图是什么? Authenticated_Homepage和Anonymous_Homepage,它们是共享一个模型还是我只有一个主页视图并使用部分视图来更改部分,或者我是否在控制器上使用角色来返回不同的视图?

只是不知道用于工作的工具是诚实的。

1 个答案:

答案 0 :(得分:0)

这不是两个观点。 MVC通常在 Action方法级别上实际使用身份验证/授权。但在您的场景中,您可以在View代码中执行以下操作:

@if(Request.IsAuthenticated) {
    <text>Welcome <strong>@User.Identity.Name</strong>!
    [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
    @:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}

这是直接从MVC 3模板中提取的。在这种情况下,这是在_Layout.cshtml共享视图上呈现的部分视图代码。这样就会在每个页面上呈现(如果您来自WebForms背景,请将_Layout视为“母版页”)。

所有部分视图代码都是对经过身份验证的用户进行测试。如果是经过身份验证的用户,则会显示欢迎消息。如果不是,那么有一个ActionLink()来获取Login Action方法以便能够授权。

通常你会限制/允许用户/角色使用某些行动方法,这就是你要做的:

 public ActionResult EverybodyCanAccess()
 {
     return View();
 }

 [Authorize]
 public ActionResult OnlyAuthenticatedUsersCanAccess()
 {
     return View();
 }

 [Authorize(Roles = "Admin")]
 public ActionResult OnlyAdminsCanAccess()
 {
     return View();
 }

 [Authorize(Users = "John, Bob")]
 public ActionResult OnlyJohnAndBobCanAccess()
 {
     return View();
 }