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

问题描述 投票:0回答:8

使用: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)
c# asp.net asp.net-mvc razor
8个回答
118
投票

找到解决方案:我认为有拼写错误,ViewBag.Typo <-- this caused the error, but the debugger placed the exception at a irrelevant place.


20
投票

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

通常这会浪费很多时间。


18
投票

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

如果使用反射来动态更新属性值,则值得检查以确保传递的

PropertyName
与实际属性相同。

就我而言,我试图更新

Employee.firstName
,但该属性实际上是
Employee.FirstName

值得牢记。 :)


5
投票

我对这个错误的解决方案是从另一个引用了

@Model.Id
的项目中复制并粘贴。这个特定的页面没有模型,但错误线与实际错误相去甚远,我几乎从未找到它!


2
投票

与 Razor 无关,您会在运行时尝试访问动态值中不存在的属性时看到异常:

dynamic myValue;
if(myValue.notExistedProperty == "some-value") { ... }

1
投票

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

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

0
投票

与 Ravor 无关,但是就我而言,在运行单元测试时不断收到此错误。

幸运的是,经过进一步调查,这就是空引用错误的原因。

背景:我正在添加一个新的配置文件,并想为此编写一些测试。我也在测试项目中添加了这个配置文件。由于某种原因,.NET 单元测试无法在运行时解析期间选取此文件。可能是,该文件在

bin
目录中不可用,或者
obj
文件夹未刷新。

为了解决这个问题,我必须删除我的

bin
obj
文件夹并重建项目 - 这似乎有效。

.NET 单元测试和 MSBuild 能够成功获取文件夹中的文件,并能够将其绑定到我的模型类并解析(配置文件到我的模型映射)


-4
投票

设置

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

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

© www.soinside.com 2019 - 2024. All rights reserved.