我试图允许用户使用他们的Facebook,Twitter,Google或Microsoft帐户登录我的MVC4网站。页面加载正常但是当单击其中一个按钮以使用其中一个服务进行身份验证时,我收到错误。
System.ArgumentNullException:值不能为空。
错误是指帐户控制器中的这行代码,因为Provider
为空
OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);
这行代码属于此控制器操作
internal class ExternalLoginResult : ActionResult
{
public ExternalLoginResult(string provider, string returnUrl)
{
Provider = provider;
ReturnUrl = returnUrl;
}
public string Provider { get; private set; }
public string ReturnUrl { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);
}
}
页面加载时,每个按钮的值都按预期设置。已编译页面的页面源显示名称和值集。在这个例子中,对于twitter
<div class="authprovider">
<input type="image" name="Provider" value="twitter" alt="Sign in using Twitter" src="/Images/twitter.png" title="Twitter" />
</div>
在AuthConfig文件中的RegisterAuth()
下,twitter部分看起来像这样
OAuthWebSecurity.RegisterTwitterClient(
consumerKey: "*Hidden*",
consumerSecret: "*Hidden*",
displayName:"Twitter",
extraData:new Dictionary<string, object>{{"Icon","/Images/twitter.png"}});
在名为_ExternalLoginsListPartial的局部视图中,输出按钮的代码如下所示
@foreach (AuthenticationClientData p in Model)
{
<div class="authprovider">
<input type="image" name="Provider" value="@p.AuthenticationClient.ProviderName" alt="Sign in using @p.DisplayName" src="@p.ExtraData["Icon"].ToString()" title="@p.DisplayName" />
</div>
}
我已将输入类型更改为image
以允许图像按钮。默认情况下,它的类型为submit
。所有4个extenal登录选项都会发生此错误。希望别人碰到它,到目前为止让我摸不着头脑。
[编辑15:41]
更改按钮返回提交似乎已经通过了,但我真的不想要一个可怕的按钮而不是图像。
答案 0 :(得分:0)
嗯,事实证明<input type='image'
返回点击图像的坐标,而不是指定的值。
我找到的工作是将输入更改为按钮,该按钮封装了如下图像。
<div class="authprovider">
<button type="submit" name="Provider" value="@p.AuthenticationClient.ProviderName"><img alt="Sign in using @p.DisplayName" src="@p.ExtraData["Icon"].ToString()" title="@p.DisplayName"/></button>
</div>
然后添加样式以删除按钮颜色等
.authprovider button {
background-color: #fff;
border: none;
}