2011-02-23 73 views
2

我正在玩弄使用ASP.NET MVC3,并有一个简单的网站,只允许您登录/创建一个帐户或列出您的帐户的详细信息。这个ASP.NET MVC ActionMethod应该有两个视图吗?

我想做主页.. bascially。如果你没有登录,请让他们登录或创建一个新帐户。否则,向他们展示他们的账户信息。简单。

所以我不知道我是否应该做这样的事情....

public ActionResult Index() 
{ 
    return User.Identity.IsAuthenticated ? View("Show") : View("Index"); 
} 

这是一个相当人为的例子,但它基本上描述了我的问题。

我觉得这不是一个好方法..但相反,我应该重定向到一种不同的方法..就像真正的秀? ..例如。/Show/UserFoo?

我只是不确定人们在做什么 - 这是一种常见模式。

想法?

+0

不,这不是很RESTful。 '/ index'资源不应该与登录有关。它也使得可用性更难。只需重定向到'/ login',就像@Darin所说的那样。 :)所以我猜这里的“常见模式”是保持URL相关,这是REST的重要组成部分 - 而ASP.NET MVC的特定模式是action方法中面向aspect的Authorize属性。 – bzlm 2011-02-23 10:11:50

+0

关于使用(或不使用)不同视图,取决于认证与未认证演示文稿之间的变化。如果两者之间有很多变化,那么两种不同的观点是可以的。如果大部分是常见的,那么如果视图是使用控件(从公共基类继承的)实现的,那么您可以在运行时决定应该使用哪种控件(多态)。 – 2011-02-23 10:13:45

+0

@bzlm,你假设如果用户没有通过身份验证,他们需要。在很多情况下,显示的页面实际上是相同的(对于已验证和未验证的用户)。对于一个简单的例子,如果你已经登录了,你可以在顶部看到你的用户名,但如果你不是,那么大部分页面的其余部分都是一样的。 – 2011-02-23 10:18:18

回答

6

您可以使用[Authorize]属性来检查用户是否已通过身份验证,是否重定向到登录页面。

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

如果您不喜欢默认行为,您也可以编写自定义授权属性。

+0

但是如果默认页面是索引/主页,会发生什么? – 2011-02-23 10:34:38

+0

@ Pure.Krome,如果默认页面是/ home/index,并且您使用'[Authorize]'属性装饰了Index操作,并且用户未通过身份验证,他将被重定向到登录页面。因此只将该属性放在需要验证的控制器操作上。 – 2011-02-23 11:06:22

+0

是的..但我很想知道如果登录页面是主页。那将意味着无限的重定向,对吧? – 2011-02-23 13:56:28

-2

。利用一个LoginView项目:

<asp:LoginView runat="server"> 
    <LoggedInTemplate> 
     // this is seen by users who are authenticated, so display info 
    </LoggedInTemplate> 
    <AnonymousTemplate> 
     // this is seen by users not authenticated - so display login form 
    </AnonymousTemplate> 
</asp:LoginView> 

您将需要的东西来管理身份验证,[Authorize]属性可以为你做的,或者你可以写自己的自定义实现。

+4

干杯@AndyC,但我想避免像鼠疫这样的ASP.NET控件。 – 2011-02-23 10:59:14

1

我会说,不。主要是因为如果你想在两者之间有共同的内容,这将有助于你保持干爽。

取而代之的是检查视图内部是否有人被认证。

剃须刀(干码):

@if (User.Identity.IsAuthenticated) { 
Welcome back, @User.Identity.Username! 
} else { 
Please <a href="/login">login</a>! 
} 

我认为这将有助于使事情变得干燥。

+0

所以这仍然是一个视图,但是根据一些数据(例如,用户登录或不登录),部分视图是隐藏/未隐藏的。 – 2011-02-23 21:47:19

相关问题