2013-10-28 35 views
17

我一直在努力將MVC4項目轉換爲MVC5。第一天我遇到了一個'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException',但能夠通過開始我的轉換來解決它。我不確定這是一個什麼樣的問題,因爲它再次發生。MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

加載Login.cshtml頁面時,_ExternalLoginsListPartial.cshtml中發生錯誤。該錯誤是在管線15拋出(串行動= Model.Action)

@using Microsoft.Owin.Security 

@{ 
    var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes(); 
    var authenticationDescriptions = loginProviders as AuthenticationDescription[] ?? loginProviders.ToArray(); 
    if (!authenticationDescriptions.Any()) 
    { 
     <div> 
      <p>There are no external authentication services configured. See <a href="http://go.microsoft.com/fwlink/?LinkId=313242">this article</a> 
      for details on setting up this ASP.NET application to support logging in via external services.</p> 
     </div> 
    } 
    else 
    { 
     string action = Model.Action; 
     string returnUrl = Model.ReturnUrl; 
     using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl })) 
     { 
      @Html.AntiForgeryToken() 
      <div id="socialLoginList"> 
       <p> 
       @foreach (AuthenticationDescription p in authenticationDescriptions) 
       { 
        <button type="submit" class="btn btn-default padded-8 margin-8" id="@p.AuthenticationType" name="provider" 
          value="@p.AuthenticationType" title="Log in using your @p.Caption account"> 

         <img src="@Url.Content("~/Content/Brands/"+p.Caption+".png")" alt="Microsoft" class="img-responsive" /> 
         <br/> 
         <b>@p.Caption</b> 
        </button> 
       } 
       </p> 
      </div> 
     } 
    } 
} 

引發的錯誤是

發生在系統類型「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」的例外.Core.dll但在用戶代碼中沒有處理

其他信息:「對象」不包含「操作」

在S的定義napshot說

消息:對象」不包含定義‘行動’ 來源:匿名運行DynamicMethods大會

現在,這是雙重奇怪,因爲當我設置一個斷點Model.Action不空值。我可以看到價值。

這真令人沮喪。該應用程序工作5分鐘前..我已經改變了非關聯頁面上的HTML ..現在它不會工作。

Hackish Fix 我想知道爲什麼會出現這個錯誤。也就是說,我有一個快速修復,以防其他人遇到這種情況(因爲這是默認解決方案的一部分)。解決方案是不使用動態。創建您自己的視圖模型並通過它。

public class ExternalLoginViewModel 
{ 
    [Display(Name = "ReturnUrl")] 
    public string ReturnUrl { get; set; } 

    [Required] 
    [Display(Name = "Action")] 
    public string Action { get; set; } 
} 

@Html.Partial("_ExternalLoginsListPartial", new ExternalLoginViewModel { Action = "ExternalLogin", ReturnUrl = ViewBag.ReturnUrl }) 
+5

我有完全相同的問題。很奇怪。 – par

+1

我設法通過簡單地傳遞動作字符串並在_ExternalLoginsListPartial中直接使用ViewBag.ReturnUrl來解決問題 - 而不是創建新的ViewModel。 – par

+1

你知道底層問題是什麼嗎?我記得我也有這個問題,但是這是因爲我的ViewModels沒有正確引用cshtml;但現在它又一次發生了,我無法弄清楚什麼是錯的! – teh0wner

回答

0

是的,我換成以下和工作,但仍然想看看它爲什麼沒有使用Model.Action時工作「其他」代碼?

//string action = Model.Action; 
//string returnUrl = Model.ReturnUrl; 
//using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl })) 
using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl })) 
+1

如果你想通過多個動作來重複使用這個視圖,那麼這是沒有用的(作爲最初的互聯網項目[和我的])。它沒有解決潛在的問題。 – nVentimiglia

+0

我得到了這個固定的(字符串行動= Model.Action;)對我來說工作正常,我重新檢查cshtmls中的所有模型這些用於登錄和註冊功能,我發現我的問題在Register.cshtml.BTW修復我得到這個問題,同時從MVC 4升級到MVC 5. – user2918406

+2

解決方案是? – nVentimiglia

4

入住的賬戶文件夾和一個具有明確的模式,確保(視圖)模型是正確的命名空間中每一個意見。將鼠標懸停在m參數(m => m.UserName ...等)上並確保它正在引用正確的(視圖)模型。 在我的情況下,我將AccountViewModels移動到了不同的文件夾,並且應用程序如上所述崩潰。看來這些視圖有點像從原來的命名空間「緩存」模型。我使用了一個愚蠢的修補程序(將@model行註釋掉,然後取消註釋)。有警告說m是動態的,但是當它被構建並運行時它就工作了。看起來像VS 2013 RTM中的一個小故障。

+0

我的名字空間是正確的。錯誤發生在沒有模型的局部視圖中。 – nVentimiglia

+0

@nVentimiglia - 錯誤發生在這一行:string action = Model.Action的_ExternalLoginsListPartial.cshtml文件和Model.Action在調試中具有正確的值。檢查有模型的視圖並確保它們的m參數是正確的(即使它們編譯正常)。 – AKhooli

+0

確認我的命名空間是正確的....說我說我的模型聲明和問題消失了。 這就是說,我有一個破解版本的項目(在我上面修復之前)保存。我可以確認項目模型是默認的,正確的名稱空間和Login.cshtml中的有效模型聲明。 – nVentimiglia

1

經過一番嘗試,找到了我自己的(mvc5)項目解決方案。

我有_ExternalLoginsListShoppingCartPartial.cshtml(來自我的mvc4項目),頂部有@model ICollection<AuthenticationClientData>。我評論說,重建解決方案並突然生效。我甚至沒有在任何視圖中使用該部分視圖,所以這是一個非常討厭的錯誤imo。

因此請檢查您的項目。你可能有一些mvc4/simplemembership的東西搞亂了你的mvc5項目。

1

將帳戶模型替換到另一個文件夾後,我得到了同樣的錯誤。當我仔細檢查Account文件夾下的每個視圖時,我發現我的「Manage.cshtml」引用了舊的命名空間。我將其更改爲修正了我的模型的名稱空間,並修復了錯誤。

1

對我來說,我已經改變了ManageUserViewModel的內容來添加一個屬性...然後我開始出現錯誤。當我改變了Manage.cshtml從沒有使用顯式模型使用:

@model XYZ.Models.ManageUserViewModel

和刪除using語句的時候,就開始工作了。浪費了一個小時!

1

我也打在VS 2013 U3這個問題。我剛剛使用[EmailAddress]屬性向RegisterViewModel添加了一個電子郵件字段,並且在我嘗試訪問Register頁面時發生崩潰。評論[EmailAddress]屬性解決了問題。但是,在我添加屬性後它繼續工作,所以這可能是更廣泛的問題,可能與模型類的更改有關。