ASP.NET MVC — как отобразить представление ActionResult, которое возвращается в javascript?

Я использую DotNetOpenAuth с настраиваемым провайдером входа в систему для входа пользователей на мой сайт. У меня работает большая часть кода, но у меня возникла проблема с возвратом представления и его отображением, чтобы пользователи могли войти в провайдер. По сути, действие возвращает результат действия, который является страницей входа в конкретный провайдер обратно в вызывающий javascript. Я ожидал этого, так как мне нужно вернуть результаты входа в javascript. По сути, происходит следующее: я получаю некоторую ошибку о разрешении доступа, затем три пустых поля (посмотрите в ответе на вызов), а затем ничего. Мне нужно, чтобы перейти на сайт провайдера и авторизоваться.

Пример данных: url = https://www.google.com/accounts/o8/id , requiredUserName = 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 });
    }

person Dave    schedule 01.11.2010    source источник
comment
Я заметил, что вы возвращаете Json в случае ошибки. Обычно я бы не предлагал этого; вместо этого сгенерируйте исключение. Если Json не содержит данных, которые вы планируете показывать пользователю, вы можете просто создать исключение, а затем использовать параметр error jQuery $.ajax.   -  person Domenic    schedule 01.11.2010
comment
Также обратите внимание, что это error, а не failure: api.jquery.com/jQuery.ajax   -  person Domenic    schedule 01.11.2010
comment
Да, это просто код, который поможет мне через банкомат выяснить, как обрабатывать вызов. В конце концов я изменю его, чтобы он делал реальные вещи, просто хочу, чтобы там были некоторые отладочные материалы. Спасибо за предложение.   -  person Dave    schedule 01.11.2010


Ответы (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;
    }
}
person Domenic    schedule 01.11.2010
comment
Я действительно приближался к чему-то подобному. Я сделал OutgoingWebResponse x = _openId.CreateRequest(providerUrl).RedirectingResponse; вернуть Json (новый {Location = x.Headers[Location]}); Это работает, чтобы добраться до провайдера, но возврат к действию - 404, нужно разобраться. - person Dave; 01.11.2010
comment
Кроме того, RedirectingResponse не имеет свойства Uri. Аренда, что я вижу. - person Dave; 02.11.2010
comment
Хм, так это кажется правильной идеей. Но я не понимаю, что означает возврат к Action is 404... - person Domenic; 02.11.2010
comment
Я понял, что эта часть заключалась в том, как возвращался URL-адрес возврата. Но да, это была правильная идея, как с этим справиться, определенно правильный ответ! - person Dave; 02.11.2010