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

Posted

技术标签:

【中文标题】无法对空引用执行运行时绑定,但它不是空引用【英文标题】:Cannot perform runtime binding on a null reference, But it is NOT a null reference 【发布时间】:2013-10-27 18:40:08 【问题描述】:

使用: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)

【问题讨论】:

你确定它首先通过你的方法正确吗? 在你的 Index() 方法和视图中放置断点,看看这是否有助于你找出问题所在。 找到了我自己的答案,一切都是正确的,在我看来,我在一个完全不相关的对象上有一个错字,我有一个 ViewBag.TypoObject 【参考方案1】:

找到解决方案:我的视图中有错字,ViewBag.Typo

【讨论】:

刚刚遇到了同样的问题,即调试器将异常放置在视图中的错误位置。我在下面有一个空引用。 非常烦人的特性。我的意思是说真的,调试器,如果你不知道问题出在哪里或哪里,当你假装知道时,它实际上会让事情变得更难 阿格格!只花了一个小时!有一个在几个不同的地方使用的部分视图......模型生成的完全相同,但是当从一个操作结果而不是另一个操作结果引用时出错。最终也成为 ViewBag 问题。它是在一个动作中设置的,而不是在另一个动作中。令人沮丧!!! 这也为我节省了一些时间。有一个类似的问题,我正在访问一个不再存在的 ViewBag 属性,但错误“无法对空引用执行运行时绑定”使它看起来像是在代码的不相关部分发生。 等等 - 错字是什么?【参考方案2】:

当您的 Razor 代码中有 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 无法在正确的行中显示错误。

通常这会浪费很多时间。

【讨论】:

【参考方案3】:

当使用反射动态更新不存在的属性时,也会引发此异常。

如果使用反射来动态更新属性值,则值得检查以确保传递的PropertyName 与实际属性相同。

就我而言,我试图更新Employee.firstName,但属性实际上是Employee.FirstName

值得牢记。 :)

【讨论】:

【参考方案4】:

我对此错误的解决方案是从另一个引用了@Model.Id 的项目复制并粘贴。此特定页面没有模型,但错误行与我几乎从未发现的实际错误相差甚远!

【讨论】:

【参考方案5】:

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

@if (ViewBag.States!= null)

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

【讨论】:

【参考方案6】:

设置

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

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

【讨论】:

呃,什么?控制器的属性不能从视图中访问,这就是为什么有 ViewBag 和/或 ViewModel... 使用集合初始化器绝对没有错。这不会解决问题。

以上是关于无法对空引用执行运行时绑定,但它不是空引用的主要内容,如果未能解决你的问题,请参考以下文章

第 1034 行:字符 9:运行时错误:引用绑定到类型为“int”的空指针 (stl_vector.h)

运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)

运行时错误:引用绑定到“std::vector<int, std::allocator<int> >”类型的空指针 (stl_vector.h)

AppsFlyer Xamarin iOS 绑定,空引用异常

0x800a138f - JavaScript 运行时错误:无法获取未定义或空引用的属性“mData”

无法获取未定义或空引用的属性 - Windows 8 JS/CSS 应用程序