ASP.NET MVC - Как да покажа изглед на ActionResult, който се връща към javascript?

Използвам DotNetOpenAuth с персонализиран доставчик за влизане, за да вписвам потребителите в моя сайт. Повечето от кода ми работят, но имам проблем с връщането на изгледа и показването му, така че потребителите да могат да влизат в доставчика. По принцип действието връща резултат от действието, което е страницата за вход на конкретния доставчик обратно към извикващия 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 });
    }

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; return Json(new { Location = x.Headers[Location] }); Това работи, за да стигнете до доставчика, но връщането към действието е 404, трябва да разбера това. - person Dave; 01.11.2010
comment
Освен това RedirectingResponse няма свойство Uri. Дайте под наем, че виждам. - person Dave; 02.11.2010
comment
Хм, това изглежда като правилната идея. Но не разбирам какво означава връщането към действието 404... - person Domenic; 02.11.2010
comment
Разбрах го, тази част беше как URL адресът за връщане се предава обратно. Но да, това беше правилната идея как да се справя, определено правилният отговор! - person Dave; 02.11.2010