ASP.NET MVC - 如何显示返回到javascript的“ActionResult”视图?

时间:2010-11-01 20:05:59

标签: javascript jquery asp.net-mvc dotnetopenauth

我正在使用DotNetOpenAuth与自定义登录提供程序签署用户进入我的网站。我有大部分代码工作,但是返回视图并显示它有问题,以便用户可以登录到提供程序。基本上,该操作返回一个actionresult,它是特定提供程序上的登录页面,返回到调用javascript。我期待这一点,因为我需要将登录结果返回到javascript。基本上,发生的事情是我得到一些关于允许访问然后三个空框(查看调用返回)然后什么都没有的错误。我需要它来转到提供者站点并登录。

数据示例:url = https://www.google.com/accounts/o8/id,requiresUserName = false,username = test(假设它已输入文本框)。

以下是代码:

JavaScript的:

function ProviderSignOn(url, requiresUserName) {
    var username = $("#openUserNameText").val();
    if ((requiresUserName == 'True') && (username == '')) {
        clickedProviderUrl = url;
        $('#openUserNameDiv').show('fast');
    }
    else {
        $('#openUserNameDiv').hide('fast');
        $("#openUserNameText").val('');
        $.ajax({
            type: "POST",
            url: "/Account/ProviderSignOn",
            data: "provider=" + url + "&username=" + username,
            success: function (data) {
                alert(data.Error);
                alert(data.Message);
                alert(data.Identifier);
            },
            failure: function (data) {
                alert(data.Error);
                alert(data.Message);
                alert(data.Identifier);
            }
        });
    }
}

控制器操作:

public ActionResult ProviderSignOn(string provider, string username)
    {
        string providerUrl = provider.Replace("{username}", username);
        bool error = true;
        string message = String.Empty;
        string identifier = String.Empty;

        var response = _openId.GetResponse();

        if (response == null)
        {
            Identifier id;

            if (Identifier.TryParse(providerUrl, out id))
            {
                try
                {
                    return _openId.CreateRequest(providerUrl).RedirectingResponse.AsActionResult();
                }
                catch (ProtocolException ex)
                {
                    throw ex;
                }
            }
            else
            {
                error = true;
                message = "Invalid";
                identifier = String.Empty;
            }
        }
        else
        {
            switch (response.Status)
            {
                case AuthenticationStatus.Authenticated:
                    error = false;
                    message = "Success";
                    identifier = response.ClaimedIdentifier;
                    break;
                case AuthenticationStatus.Canceled:
                    error = true;
                    message = "Canceled";
                    identifier = String.Empty;
                    break;
                case AuthenticationStatus.Failed:
                    error = true;
                    message = "Failed";
                    identifier = String.Empty;
                    break;
            }
        }

        return Json(new { Error = error, Message = message, Identifier = identifier });
    }

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么你就会接触到这行代码:

return _openId.CreateRequest(providerUrl).RedirectingResponse.AsActionResult();

但是JavaScript不知道如何处理从Ajax调用返回的重定向结果。

在这种情况下,我会说你回错了。相反,你应该做这样的事情:

return Json(new { RedirectUri = _openId.CreateRequest(providerUrl).RedirectingResponse.Uri });

但我不知道对象RedirectingResponse是什么类型的对象(例如它是否有任何Uri属性?)。只有providerUrl无效,对吧?

无论如何,然后在你的JavaScript中你可以做到

success: function (data)
{
    if (data.RedirectUri)
    {
        window.location.href = data.RedirectUri;
    }
}