17

MVC4 プロジェクトを MVC5 に変換する作業を行っています。初日に「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」に遭遇しましたが、変換をやり直すことで解決できました。それが再び起こったので、何が残念な修正だったのかわかりません。

Login.cshtml ページを読み込むと、_ExternalLoginsListPartial.cshtml でエラーが発生します。エラーは 15 行目でスローされます。 (string action = 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' の例外が System.Core.dll で発生しましたが、ユーザー コードでは処理されませんでした

追加情報:「オブジェクト」には「アクション」の定義が含まれていません

スナップショットは言う

メッセージ: object' には 'Action' の定義が含まれていません ソース: Anonymously Hosted DynamicMethods Assembly

ブレークポイントを設定するとModel.Actionがnullではないため、これは二重に奇妙です。価値がわかります。

これは本当にイライラします。アプリは 5 分前に動作していました.関連のないページの html を変更しました..そして今は動作しません。

ハック的な修正 このエラーが発生する理由を知りたいです。そうは言っても、他の誰かがこれに遭遇した場合に備えて、簡単な修正があります(これはデフォルトのソリューションの一部であるため)。解決策は、ダイナミクスを使用しないことです。独自のビューモデルを作成して渡します。

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

7 に答える 7

4

Account フォルダー内のビューを確認し、明示的なモデルを持つビューごとに、(ビュー) モデルが正しい名前空間にあることを確認します。m パラメータ (m => m.UserName ... など) の上にマウスを移動し、正しい (ビュー) モデルを参照していることを確認します。私の場合、 AccountViewModels を別のフォルダーに移動したところ、上記のようにアプリが壊れました。ビューは、元の名前空間からモデルを「キャッシュ」しているようです。私はばかげた修正を使用しました( @model 行をコメントアウトし、コメントを外して戻します)。m は動的であるという警告を受け取りましたが、ビルドして実行すると機能しました。VS 2013 RTM の不具合のようです。

于 2013-11-06T06:22:12.403 に答える
1

アカウント モデルを別のフォルダーに置き換えた後、同じエラーが発生しました。Account フォルダーの下の各ビューを再確認したところ、"Manage.cshtml" が古い名前空間を参照していることがわかりました。モデルの正しい名前空間に変更し、エラーを修正しました。

于 2014-01-25T17:29:32.527 に答える
1

VS 2013 U3 でもこの問題に遭遇しました。[EmailAddress] 属性を使用して RegisterViewModel に電子メール フィールドを追加したところ、登録ページにアクセスしようとするとクラッシュしました。[EmailAddress] 属性をコメントアウトすると、問題が修正されました。ただし、属性を再度追加した後も引き続き機能するため、これはおそらく、モデル クラスの変更に関係する広範な問題です。

于 2014-09-01T21:01:55.633 に答える
1

いくつかの実験の後、自分の(mvc5)プロジェクトの解決策を見つけました。

上部に_ExternalLoginsListShoppingCartPartial.cshtml(私のmvc4プロジェクトから)があり@model ICollection<AuthenticationClientData>ました。コメントアウトしてソリューションを再構築すると、突然機能します。私はどのビューでもその部分ビューを使用していないので、かなり厄介なバグです。

プロジェクトをチェックインします。mvc5 プロジェクトを台無しにしている mvc4/simplemembership のものがあるかもしれません。

于 2013-11-21T13:53:33.847 に答える
0

ええ、「else」コードを次のコードに置き換えて動作しましたが、 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 }))
于 2013-11-04T20:01:09.150 に答える