这个 ASP.NET MVC ActionMethod 应该有两个视图吗?

Posted

技术标签:

【中文标题】这个 ASP.NET MVC ActionMethod 应该有两个视图吗?【英文标题】:Should this ASP.NET MVC ActionMethod have two views? 【发布时间】:2011-02-23 10:04:48 【问题描述】:

我正在使用 ASP.NET MVC3 并有一个非常简单的网站,只允许您登录/创建帐户或列出您的帐户详细信息。

我想制作主页.. 基本上就是这样。如果您没有登录,请让他们登录或创建一个新帐户。否则,向他们展示他们的帐户详细信息。很简单。

所以我不确定我是否应该做这样的事情......

public ActionResult Index()

    return User.Identity.IsAuthenticated ? View("Show") : View("Index");

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

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

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

想法?

【问题讨论】:

不,这不是很 RESTful。 /index 资源不应该与登录有任何关系。它也使可缓存性更难。就像@Darin 建议的那样,只需重定向到/login。 :) 所以我猜这里的“通用模式”是保持 URL 的相关性,这是 REST 的重要组成部分 - 而 ASP.NET MVC 的特定模式是操作方法上面向方面的 Authorize 属性。 关于使用(或不使用)不同的视图,这取决于经过身份验证的演示文稿与未经身份验证的演示文稿之间有多少变化。如果两者之间发生了很多变化,那么两种不同的观点就可以了。如果大部分是常见的,那么如果视图是使用控件(从公共基类继承)实现的,那么您可以在运行时决定应该使用哪些控件(多态性)。 @bzlm,您假设如果用户未通过身份验证,则他们需要。在许多情况下,显示的页面实际上是相同的(对于经过身份验证和未经身份验证的用户)。对于(一个简单的)示例,在 SO 上,如果您已登录,您会在顶部看到您的用户名,但如果您不是,则页面的其余部分大部分是相同的。 @Shiv 我什么都不假设。该问题特别指出“如果您没有登录,请让他们登录或创建一个新帐户。否则,向他们显示他们的帐户详细信息”。 ;) @bzlm,你说得对。我以某种方式错过了。:) 【参考方案1】:

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

[Authorize]
public ActionResult Index()

    return View();

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

【讨论】:

但是如果默认页面是索引/主页会发生什么? @Pure.Krome,如果默认页面是 /home/index 并且您使用 [Authorize] 属性装饰 Index 操作并且用户未通过身份验证,他将被重定向到登录页面。因此,仅将此属性放在需要身份验证的控制器操作上。 是的..但我很想知道登录页面是否是主页。那将意味着无限重定向,对吗?【参考方案2】:

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

而是在视图内部检查某人是否经过身份验证。

剃须刀(干码):

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

我认为这将有助于保持干燥。

【讨论】:

所以这仍然是一个视图,但是根据某些数据(例如,用户是否登录),部分视图被隐藏/不隐藏。【参考方案3】:

利用 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] 属性可以为您做到这一点,或者您可以编写自己的自定义实现。

【讨论】:

干杯 @AndyC 但我想避免像瘟疫一样的 ASP.NET 控件。

以上是关于这个 ASP.NET MVC ActionMethod 应该有两个视图吗?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

asp.net MVC之整合AJAX

请问:ASP.net mvc5和asp.net.core有啥区别呢?在今后的发展中这个前景怎么样?

ASP.NET从MVC5升级到MVC6

ASP.NET MVC学习之路由篇

简述关于ASP.NET MVC与.NET CORE 的区别