Невозможно выполнить привязку времени выполнения к пустой ссылке, но это НЕ пустая ссылка

80

с использованием: MVC 4, ASP.NET Razor

Я получаю сообщение об ошибке, которое, похоже, недопустимо. Он сообщает мне, что я использую нулевую ссылку, состояния, но явно она устанавливается.

Контроллер:

public ActionResult Index()
{
    Dictionary<int, string> states = new Dictionary<int, string>()
    {
        { -1, "a"},
        { 0, "b"},
        { 1, "c"},
        { 2, "d"},
    };

    //assigning states
    ViewBag.States = states;

    foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        Debug.WriteLine(de.Key);
    }
    return View();
}

Вид:

<div class="search-input">
    <select>
        @foreach (KeyValuePair<int, string> de in ViewBag.States)
        {
            <option value="@de.Key">@de.Value</option>
        }
    </select>
</div>

Ошибка:

Cannot perform runtime binding on a null reference
Line 54: @foreach (KeyValuePair<int, string> de in ViewBag.States)
генеральный кодировщик
источник
3
Вы уверены, что сначала он правильно проходит через ваш метод?
Джон Скит
1
Поместите точки останова в свой Index()метод и представление и посмотрите, поможет ли это понять, что не так.
Тим С.
3
Нашел свой собственный ответ, все было правильно, внутри, на мой взгляд, у меня была опечатка на совершенно несвязанном объекте, у меня был ViewBag.TypoObject <- это привело к тому, что все испортилось
generalcoder

Ответы:

108

Найдено решение: на мой взгляд, у меня была опечатка, ViewBag.Typo <- это вызвало ошибку, но отладчик поместил исключение в несоответствующее место.

генеральный кодировщик
источник
11
Просто была та же проблема, когда отладчик помещал исключение в неправильную точку представления. У меня была пустая ссылка ниже.
user1616625
5
Очень досадная черта. Я имею в виду на самом деле, отладчик, если вы не знаете , что и где проблема на самом деле делает вещи труднее , когда вы делаете вид , что вы делаете.
glenatron
2
Аргггг! Просто потратил на это час! Было частичное представление, которое использовалось в нескольких местах различий ... Модель была сгенерирована ТОЧНО, но с ошибкой при обращении из одного результата действия, а не из другого. В конце концов, это тоже проблема ViewBag. Это происходило в одном действии, а не в другом. РАЗДРАЖЕНИЕ !!!
ajzeffer
Это тоже сэкономило мне время. Была аналогичная проблема, когда я получал доступ к свойству ViewBag, которого больше не существовало, но ошибка «Невозможно выполнить привязку времени выполнения для нулевой ссылки» создавала впечатление, что это происходит в несвязанной части кода.
Крис Морган
8
подождите - в чем была опечатка?
Cullub
16

Эта ошибка возникает, когда у вас есть ViewBag Non-Existent в вашем коде бритвы, вызывающем метод.

Контроллер

public ActionResult Accept(int id)
{
    return View();
}

бритва:

<div class="form-group">
      @Html.LabelFor(model => model.ToId, "To", htmlAttributes: new { @class = "control-label col-md-2" })
     <div class="col-md-10">
           @Html.Flag(Model.from)
     </div>
</div>
<div class="form-group">
     <div class="col-md-10">
          <input value="@ViewBag.MaximounAmount.ToString()" />@* HERE is the error *@ 
     </div>
</div>

По какой-то причине .net не может показать ошибку в правильной строке.

Обычно это приводит к потере времени.

После
источник
13

Это исключение также возникает, когда несуществующее свойство обновляется динамически с использованием отражения.

Если вы используете отражение для динамического обновления значений свойств, стоит проверить, чтобы переданное было PropertyNameидентично фактическому свойству.

В моем случае я пытался обновить Employee.firstName, но свойство было на самом деле Employee.FirstName.

Стоит иметь в виду. :)

XtraSimplicity
источник
5

Мое решение этой ошибки заключалось в том, что я скопировал и вставил из другого проекта, в котором была ссылка на @Model.Id. У этой конкретной страницы не было модели, но строка ошибки была так далека от фактической ошибки, которую я почти никогда не обнаружил!

Эонасдан
источник
1

Вы должны определить состояния, не равные нулю.

@if (ViewBag.States!= null)
{
    @foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        value="@de.Key">@de.Value 
    }
}                                
Cuteboy_Max
источник
-4

Набор

 Dictionary<int, string> states = new Dictionary<int, string>()

как свойство вне функции и внутри функции вставьте записи, он должен работать.

Александр
источник
1
Что? Свойства контроллера недоступны из представления, поэтому есть ViewBag и / или ViewModel ...
Томас Левеск
2
Нет ничего плохого в использовании инициализатора коллекции. Это НЕ решит проблему.
Дэвид Л.