Asp.net mvc 4 使用Angular登录后刷新MVC视图

Asp.net mvc 4 使用Angular登录后刷新MVC视图,asp.net-mvc-4,angularjs,breeze,Asp.net Mvc 4,Angularjs,Breeze,使用这里找到的模板,我试图更新一个在用户身份验证后更改的菜单 我的示例与默认模板略有不同,因为我已将登录和注册视图移动到模式窗口中。当模式在成功登录后关闭时,MVC视图(而不是角度视图)中的菜单不会更新,因为不会发生完整的页面刷新 在SPA模板中,在进入SPA之前需要进行身份验证,然后发生硬重定向/刷新并加载SPA。在我的情况下,您可以在验证之前浏览SPA中的视图/页面 MVC查看代码片段(Views/Home/Index.cshtml) 使用我当前的设置可以这样做吗?或者我需要将菜单移动到SP

使用这里找到的模板,我试图更新一个在用户身份验证后更改的菜单

我的示例与默认模板略有不同,因为我已将登录和注册视图移动到模式窗口中。当模式在成功登录后关闭时,MVC视图(而不是角度视图)中的菜单不会更新,因为不会发生完整的页面刷新

在SPA模板中,在进入SPA之前需要进行身份验证,然后发生硬重定向/刷新并加载SPA。在我的情况下,您可以在验证之前浏览SPA中的视图/页面

MVC查看代码片段(Views/Home/Index.cshtml)


使用我当前的设置可以这样做吗?或者我需要将菜单移动到SPA内的某个位置,并使用Angular确定要显示的菜单?如果是后者,方向如何才能最好的做到这一点?我对Angular和Breeze都是新手。

Breeze中的TempHire示例有一个非常好的方法来处理SPA的身份验证(至少在我看来!)如果这是使用Durandal,那么您需要将其适应Angular,但它们都是做相同基本原理的框架,祝您好运-

基本上,控制器操作在prepare方法调用EntityManager Provider的操作上有一个注释[Authorize]。如果401被返回(未授权),SPA将采用bootPublic路径,并且只向用户公开登录路径。登录成功后,login方法告诉窗口重新加载所有内容,此时授权通过,并调用bootPrivate方法-

shell.js(Durandal,但应具有适应性)

login.js-

    function loginUser() {
        if (!self.isValid()) return Q.resolve(false);

        return account.loginUser(self.username(), self.password())
            .then(function() {
                window.location = '/';
                return true;
            })
            .fail(self.handleError);
    }

account.loginUser函数基本上只是一个ajax调用,它将凭据传递给帐户控制器并返回成功或失败。成功后,您可以看到window.location='/'的回调被触发,该回调执行完全重新加载。失败时,只需显示警报或其他信息。

谢谢@PW Kad。我正在为Angular调整TempHire模板,因此我很熟悉,并将进一步了解它是如何工作的。我确实让我的应用程序以类似的方式强制刷新(window.location='/'),但我希望它是无缝的,因为SPA的理由之一是一个流畅的UI。根据您的建议,TempHire项目中仍然需要“硬”刷新?是的,这就是他们所使用的。这会更复杂,但你应该能够完成同样的事情与硬刷新,但这是一个很好的起点,我
... part of login/register function
if (json.success) {
    window.location = json.redirect || location.href;
} else if (json.errors) {
    displayErrors($form, json.errors);
}
...
    //#region Internal Methods
    function activate() {
        return entitymanagerprovider
            .prepare()
            .then(bootPrivate)
            .fail(function (e) {
                if (e.status === 401) {
                    return bootPublic();
                } else {
                    shell.handleError(e);
                    return false;
                }
            });
    }

    function bootPrivate() {
        router.mapNav('home');
        router.mapNav('resourcemgt', 'viewmodels/resourcemgt', 'Resource Management');
        //router.mapRoute('resourcemgt/:id', 'viewmodels/resourcemgt', 'Resource Management', false);
        log('TempHire Loaded!', null, true);
        return router.activate('home');
    }

    function bootPublic() {
        router.mapNav('login');
        return router.activate('login');
    }
    function loginUser() {
        if (!self.isValid()) return Q.resolve(false);

        return account.loginUser(self.username(), self.password())
            .then(function() {
                window.location = '/';
                return true;
            })
            .fail(self.handleError);
    }