MVC4 oAuth导致空值异常:Provider为null

时间:2013-10-01 19:30:02

标签: c# asp.net-mvc-4 oauth

我的问题类似于这篇文章。 MVC4 oAuth causing null value exception

但是,我没有将按钮更改为图像输入。调试时,每个循环都会显示值,这些循环会为OAuth提供程序创建按钮。这里:

@model ICollection<AuthenticationClientData>

@if (Model.Count == 0)
{
  <div class="message-info">
    <p>There are no external authentication services configured. See <a href="http://go.microsoft.com/fwlink/?LinkId=252166">this article</a>
    for details on setting up this ASP.NET application to support logging in via external services.</p>
  </div>
}
else
{
  using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }))
  {
    @Html.AntiForgeryToken()
    <fieldset id="socialLoginList">
      <legend>Log in using another service</legend>
      <p>
      @foreach (AuthenticationClientData p in Model)
      {
        <button type="submit" name="provider" value="@p.AuthenticationClient.ProviderName" title="Log in using your @p.DisplayName account">@p.DisplayName</button>
      }
      </p>
    </fieldset>
  }
}

是否有任何其他情况会导致提供程序返回null并抛出错误?

编辑:事实上,经过一些调试,我发现提供商字符串没有在帐户控制器中回传到此方法

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    return new ExternalLoginResult(provider, Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
}

有人知道为什么或如何发生这种情况?如果您需要更多代码,请询问。

编辑:这是视图中存在的值的图像,但在帖子中缺失。任何建议都是最受欢迎的。

Breakpoints image of values present on page load and then missing in the post

编辑:添加了登录页面表单的整个视图。提交按钮时未提交提供者值,这在fiddler post

中得到确认

编辑:如果我在按钮上添加一个类,然后在名为provider的表单中添加一个隐藏字段。然后我可以使用jquery设置它的值。然后将该值与表单一起提交,并确定它有效。

<input type="hidden" value="" name="provider" id="provider" />
@foreach(.... etc
<button class="test" type="submit" name="provider" value="@p.AuthenticationClient.ProviderName" title="Log in using your @p.DisplayName account">@p.DisplayName</button>

然后

<script>
    $(function () {
        $('.test').click(function () {
            alert($(this).val());
            $('#provider').val($(this).val());
            return true;
        });
    });
</script>

如果有人能告诉我为什么会这样,以及如何正确地解决这个问题会很棒!

1 个答案:

答案 0 :(得分:0)

在表单提交上执行的任何错误客户端脚本或禁用提交按钮的脚本(在您的情况下为外部提供程序按钮)将导致空值。确保将ExternalLogin提供者表单发布到其ActionResult,没有任何例外。