2013-04-28 57 views
0

我想讓用戶使用他們的Facebook,Twitter,Google或Microsoft帳戶登錄到我的MVC4網站。頁面加載正常,但是當點擊其中一個按鈕以使用其中一個服務進行身份驗證時,我收到錯誤消息。MVC4 oAuth導致空值異常

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); 
     } 
    } 

頁面加載時,按預期設置每個按鈕的值。編譯頁面的頁面源顯示名稱和值集。在這個例子中,對於在AuthConfig嘰嘰喳喳

<div class="authprovider"> 
     <input type="image" name="Provider" value="twitter" alt="Sign in using Twitter" src="/Images/twitter.png" title="Twitter" /> 
    </div> 

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個外部登錄選項都會發生此錯誤。希望別人碰到它,它讓我抓到了我的頭。

[編輯15:41]

更改按鈕返回到提交似乎獲得通過,但我真的不希望一個可怕的按鈕,而不是圖像。

回答

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; 
} 
+0

我已經擁有它的按鈕,但仍然得到提供商空! – Santosh 2013-09-16 12:23:27