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

时间:2013-10-18 19:41:27

标签: c# asp.net asp.net-mvc razor

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

6 个答案:

答案 0 :(得分:90)

找到解决方案:我的视图中有拼写错误,ViewBag.Typo&lt; - 这导致了错误,但是调试器将异常置于不相关的位置。

答案 1 :(得分:12)

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

<强>控制器

things

<强>剃刀:

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

由于某种原因,.net无法在正确的行中显示错误。通常这会浪费很多时间。

答案 2 :(得分:11)

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

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

就我而言,我正在尝试更新Employee.firstName,但该属性实际上是Employee.FirstName

值得记住。 :)

答案 3 :(得分:5)

我对此错误的解决方案是从另一个引用@Model.Id的项目中复制并粘贴。这个特定的页面没有拥有一个模型,但错误行远离实际错误我从未找到它!

答案 4 :(得分:1)

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

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

答案 5 :(得分:-4)

设置

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

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