无法对空引用执行运行时绑定,但不是空引用


79

使用:MVC 4,ASP.NET Razor

我收到一个错误,看起来像不可能。它告诉我,我使用的是空引用,即States,但显然它已被设置。

控制器:

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()方法和视图中放置断点,看看是否可以帮助您查看问题所在。
Tim S.

3
找到我自己的答案,一切是正确的,我的观点里我有一个完全无关的对象上的错字,我有一个ViewBag.TypoObject < -这引起了一切搞的一团糟
generalcoder

Answers:


107

找到解决方案:我的视图中有错字ViewBag.Typo <-这导致了错误,但是调试器将异常放在了不相关的地方。


11
只是有一个相同的问题,调试器将异常放置在视图中的错误点。我在下面有一个空引用。
user1616625 2014年

5
非常烦人的特质。我的意思是,调试器,如果您不知道问题出在哪里或什么地方,那么当您假装这样做时实际上会使事情变得更难
glenatron 2014年

2
Arggggg!刚刚花了一个小时!有一个局部视图正在使用一些差异位置...模型是完全一样生成的,但是从一个动作结果而不是另一个动作结果引用时出错。最终也是ViewBag问题。它正在采取一种行动,而不是另一种行动。令人沮丧!!!
2014年

这也节省了我一些时间。有一个类似的问题,我正在访问一个不再存在的ViewBag属性,但是错误“无法对空引用执行运行时绑定”使它看起来像在代码的不相关部分上一样。
克里斯·摩根

8
等待-错字是什么?
Cullub 2014年

16

当您的剃须刀代码中调用View方法时,如果ViewBag不存在,则会发生此错误。

控制者

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

值得牢记。:)


5

我对这个错误的解决方案是从另一个引用了的项目中进行复制和粘贴@Model.Id。这种特殊页面没有一个模型,但错误行是如此遥远,从实际的错误,我从来没有关于发现它!


1

您必须定义不等于null的状态。

@if (ViewBag.States!= null)
{
    @foreach (KeyValuePair<int, string> de in ViewBag.States)
    {
        value="@de.Key">@de.Value 
    }
}                                

-4

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

作为在函数外部和函数内部插入条目的属性,它应该可以工作。


1
嗯,什么?无法从视图访问控制器的属性,这就是为什么存在ViewBag和/或ViewModel的原因...
Thomas Levesque

2
使用集合初始化器绝对没有错。这不会解决问题。
David L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.