Еще один вопрос о частичных взглядах - PullRequest
0 голосов
/ 27 мая 2011

Я чувствую себя полным идиотом, но по жизни я не могу понять, какого черта я здесь скучаю.

У меня есть следующее:

 @section TopPane

{@* @ {Html.Action ("_ OpenIDSignInPartial", "Account");} * @

@ {Html.RenderAction ("_ OpenIDSignInPartial", "Account");}

Войдите с помощью своего сайта mysite..com или зарегистрируйтесь для учетной записи @ {Html.RenderPartial ("_ LoginPartial");} @ {Html.RenderPartial ("_ RegisterPartial");}

}

Как видите, у меня есть 3 PartialПредставления оказываются.Теперь для кода контроллера ----

public class AccountController : Controller
{
    private readonly IAuthenticationService _authenticationService;
    OpenIdRelyingParty _openIdRelyingParty = new OpenIdRelyingParty(null);
    public AccountController(IAuthenticationService authenticationService)
    {
        _authenticationService = authenticationService;
    }

    public ActionResult Index()
    {
        return View();
    }
    public ActionResult SignIn()
    {
        return View();
    }
    [HttpPost]
    public ActionResult SignIn(AccountSignInViewModel accountSignInViewModel)
    {
        return View();
    }
    public ActionResult OpenIdSignIn()
    {
         AccountIndexViewModel accountIndexViewModel = new AccountIndexViewModel();
        IAuthenticationResponse authenticationResponse = _openIdRelyingParty.GetResponse();
         switch (authenticationResponse.Status)
         {
             case AuthenticationStatus.Authenticated:
                 try
                 {
                     var claimedIdentifier = authenticationResponse.ClaimedIdentifier.ToString();
                     _authenticationService.OpenIdSignIn(claimedIdentifier);
                 }
                 catch (Exception)
                 {
                     // Do something with this man!
                     throw;
                 }
                 break;
             case AuthenticationStatus.Canceled:
                 accountIndexViewModel.openIdSignInViewModel.ErrorMessage = "An Error Message";
                 break;
         }
         return View("SignIn",accountIndexViewModel); // ALWAYS an ERROR
    }
    [HttpPost]
    public ActionResult OpenIdSignIn(AccountOpenIdSignInViewModel accountOpenIdSignInViewModel)
    {
        IAuthenticationResponse authenticationResponse = _openIdRelyingParty.GetResponse();
        if (authenticationResponse == null)
        {
            Identifier identifier;
            if (Identifier.TryParse(accountOpenIdSignInViewModel.openid_identifier, out identifier))
            {
                try
                {
                    IAuthenticationRequest request =
                        _openIdRelyingParty.CreateRequest(accountOpenIdSignInViewModel.openid_identifier);

                    return request.RedirectingResponse.AsActionResult();
                }
                catch (ProtocolException protocolException) // Prolly should add some errors to the model
                {
                    ModelState.AddModelError("openid_identifier","Unable to authenticate");
                    return View("SignIn");
                }
            }
        }
        return View();
    }
    public ActionResult _OpenIDSignInPartial(AccountOpenIdSignInViewModel accountOpenIdSignInViewModel)
    {
        return PartialView("_OpenIdSignInPartial");
    }
}

Когда я перезапускаю представление из OpenIdSignIn ActionResult (), я получаю следующую ошибку Элемент модели, переданный в словарь, имеет тип 'Web.ViewModels.AccountIndexViewModel', но для этого словаря требуется элемент модели типа' Web.ViewModels.AccountSignInViewModel '.Хорошо, отлично, поэтому я верну AccountSignInViewModel правильно ??Затем я получаю сообщение об ошибке, утверждая, что для этого требуется AccountIndexViewModel ... CATCH 22 здесь.

1 Ответ

3 голосов
/ 28 мая 2011

Вы возвращаете AccountIndexViewModel на главном экране. Это означает, что 2 части должны быть строго типизированы как AccountIndexViewModel:

  • _LoginPartial
  • _RegisterPartial

Если это не так, вам нужно передать правильную модель вида при рендеринге.

Что касается _OpenIDSignInPartial, то вы оказываете его через действие _OpenIDSignInPartial, в котором вы

return PartialView("_OpenIdSignInPartial");

В соответствии с сообщением об ошибке выглядит, что _OpenIdSignInPartial.cshtml строго типизирован в AccountSignInViewModel:

@model AccountSignInViewModel

, поэтому убедитесь, что вы передаете экземпляр этой модели при возврате частичного представления:

AccountSignInViewModel signInViewModel = ...
return PartialView("_OpenIdSignInPartial", signInViewModel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...