【问题标题】:How to hide jQuery tabs until authenticated and add or show them once authenticated in MVC3?如何在经过身份验证之前隐藏 jQuery 选项卡,并在 MVC3 中经过身份验证后添加或显示它们?
【发布时间】:2012-04-13 19:40:05
【问题描述】:

总结

我目前正在尝试使用 MVC 3 架构和 jQuery UI 控件构建一个 Web 应用程序。到目前为止,我已经能够显示标签并在它们之间导航。

现在,我可以让登录页面显示在我的第一个选项卡上,因为这是此应用程序所需的第一个操作。

一旦通过身份验证,我希望能够添加一些允许使用此应用程序的其他选项卡。

该应用程序是关于包含已知人邮寄地址的电话簿列表。

也就是说,这个应用程序的工作流程是:

  1. 在首次到达网站时进行身份验证;
  2. 如果用户尚未注册,应用程序应让该用户一劳永逸地注册,使用相同的 jQuery UI 选项卡,或者可能显示新的注册选项卡或模式对话框;
  3. 通过第 1 步的身份验证后,用户现在可以访问网站的不同功能。

例如,假设我想注册一个新用户,我是这个网络应用程序管理员。我将首先针对此应用程序进行身份验证,然后我将看到任何用户都可以看到的常用选项卡,以及一个用于创建/注册能够针对此应用程序进行身份验证的新用户的特殊选项卡。网站管理员注册成功后。

我已经能够显示 LogOn 视图,我删除了模板创建的初始视图以重新创建为部分视图,以便能够将其包含在 jQuery UI 选项卡正文中。这很好用。

我的 HomeController 中还有一个 SelectTab 方法,它会根据作为输入参数传入的 id 的值知道要显示的部分视图。

现在,当我尝试从第一个 jQuery UI 选项卡上的 LogOn 局部视图导航时,这实际上是唯一可用的选项,单击“注册”链接不会让我在同一选项卡中显示“注册”局部视图。

代码示例

HomeController 类:

public class HomeController : Controller {
    public ActionResult Index() { return View(); }

    public ActionResult SelectTab(int id) {
        switch (id) {
            case 0: return RedirectToAction("Register", "Account");
            default: return RedirectToAction("LogOn", "Account");
        }
    }
}

AccountController 类:

public class AccountController {
    public ActionResult LogOn() { return PartialView(new LogOnModel()); }
    public ActionResult Register() { return PartialView(new RegisterModel()); }
}

此处所述的两个模型(LogOnModel、RegisterModel)都是模板的默认值。

还有我的 _Layout.cshtml 共享视图:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/themes/south-street/jquery-ui.css" rel="stylesheet" type="text/css" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script>
    <script>
        $(window).load(function () {
            $("#tabs").tabs({ select: function (event, ui) { selectTab(getSelectedTab()); } });
            logIn();
        });

        function logIn() {
            selectTab(-1);
            selectTab(0);
        }

        function selectTab(index) {
            var url = '@Url.Content("~/Home/SelectTab/")' + index;
            var targetDiv = "#tab" + index;
            $.get(url, null, function(result) { $(targetDiv).html(result); });
        }

        function getSelectedTab() { return $("#tabs").tabs("option", "selected"); }
        function setSelectedTab(index) { $("#tabs").tabs("option", "selected", index); }
    </script>
</head>
<body>
    <div id="tabs">
        <ul id="menu">
            <li><a href="#tab0"><span>Authenticate</span></a></li>
            @if (Request.IsAuthenticated) {
                <li><a href="#tab1"><span>About</span></a></li>
            }
        </ul>
        <div id="tab0"></div><div id="tab1"></div>
    </div>
    @RenderBody()
</body>

开发环境

我正在使用:

  1. VS2010 和 .NET 4.0;
  2. jQuery UI(版本和样式模板见_Layout.csthml代码示例);
  3. ASP.NET MVC3.

问题

*如何在单击“登录”部分视图中包含的“注册”链接到同一选项卡后呈现注册部分视图?

也许隐藏实际标签并显示另一个进行注册似乎更简单?然而,如何实现呢?*

【问题讨论】:

  • 登录后是否刷新页面?
  • 我想我可以避免它,如果这是可行的。

标签: asp.net-mvc-3 jquery-ui partial-views jquery-ui-tabs


【解决方案1】:

我建议通过 ajax 加载所有其他选项卡(登录除外)。您通过 ajax 提交登录,并在成功响应后销毁登录选项卡,然后动态添加一个新选项卡,并将 href 设置为 ajax 操作。

你可以完成你想做的事,但它需要大量的 jquery 和 ajax(我建议给knockoutjs 一个尝试)。服务器端部分是最简单的。

我认为在没有 SelectTab 开关的情况下直接调用操作也更好。

【讨论】:

  • +1 感谢您的提示。另外,我来自工业和框架背景,所以我不熟悉使用 AJAX 和所有不同的 Web 技术。我在您的链接之后阅读了有关 Knockout 的信息,我肯定会尝试一下。此外,我认为 jQuery 和 jQuery UI 是与 ASP.NET MVC 一起的领先技术,所以我想我会努力工作,这样我就可以学习“艰苦的方式”,所以一旦完成,我就会完全理解我所拥有的一切使用以实现我想要的。谦卑地,我开始相信我咬得比我能咀嚼的更多。
  • 如果你想做我想做的事,你的代码会是什么样子?一些入门指导将不胜感激,因为我想在开发 Web 应用程序方面做得更好,因为“世界”正在转向它。提供一个示例来获得所需的目标肯定会给你一个可接受的答案。我向你发誓。感谢您的好意和帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多