Подтвердить что ты не робот

MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

Я работал над преобразованием проекта 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="#" onclick="location.href='http://go.microsoft.com/fwlink/?LinkId=313242'; return false;">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, но не было обработано в коде пользователя

Дополнительная информация: "объект" не содержит определения для "Action"

Снимок говорит

Сообщение: объект 'не содержит определения для' Action ' Источник: анонимно размещенная динамическая схема сборки

Теперь это двойное странное, потому что, когда я устанавливаю точку останова Model.Action, не является нулевым. Я вижу значение.

Это действительно расстраивает. Приложение работало 5 минут назад.. Я изменил html на не связанной странице.. и теперь это не сработает.

Hackish Fix Я бы предпочел узнать, почему эта ошибка происходит. Тем не менее, у меня есть быстрое исправление, если кто-то еще сталкивается с этим (Потому что это часть части решения по умолчанию). Решение состоит в том, чтобы не использовать динамику. Создайте свой собственный viewmodel и передайте это.

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

Ответ 2

Проверьте просмотры в папке "Учетная запись" и для каждой из них с явной моделью, убедитесь, что модель (представление) находится в правильном пространстве имен. Мышь над параметром m (m = > m.UserName... и т.д.) И убедитесь, что она ссылается на правильную (View) модель. В моем случае я переместил AccountViewModels в другую папку, и приложение сломалось, как указано выше. Похоже, что виды представляют собой "кэширование" модели из исходного пространства имен. Я использовал глупые исправления (прокомментировал строку @model и не прокомментировал ее). Получил предупреждение о том, что m является динамическим, но когда он был построен и запускался, он работал. Похож на сбой в RTM VS 2013.

Ответ 3

Нашел решение для моего собственного проекта (mvc5) после некоторых экспериментов.

У меня был _ExternalLoginsListShoppingCartPartial.cshtml (из моего проекта mvc4) с @model ICollection<AuthenticationClientData> вверху. Я прокомментировал это и перестроил решение, и внезапно он работает. Я даже не использую этот частичный вид в любом представлении, так что это довольно неприятная ошибка.

Итак, проверьте свой проект. Возможно, у вас есть материал mvc4/simplemembership, который запутывает ваш проект mvc5.

Ответ 4

Я получил ту же ошибку после замены моделей учетных записей в другую папку. Когда я дважды проверял каждый вид в папке "Учетная запись", я обнаружил свой "Manage.cshtml", ссылающийся на старое пространство имен. Я изменил его, чтобы исправить пространство имен для моих моделей и исправленную ошибку.

Ответ 5

Для меня я изменил содержимое ManageUserViewModel, чтобы добавить свойство... Затем я начал получать ошибку. Когда я изменил Manage.cshtml, не используя явную модель для использования:

@model XYZ.Models.ManageUserViewModel

и удалил операторы using, он снова начал работать. Один час впустую!

Ответ 6

Я также попал в эту проблему с VS 2013 U3. Я только что добавил поле электронной почты в RegisterViewModel с атрибутом [EmailAddress], и он сбой, когда я попытался посетить страницу Register. Исправлена ​​проблема с атрибутом [EmailAddress]. Тем не менее, он продолжал работать после того, как я добавил атрибут обратно, так что это, вероятно, более широкая проблема, которая может иметь отношение к изменениям в классах модели.

Ответ 7

Да, я заменил код "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 }))