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

qlvxas9a  于 2022-11-19  发布在  .NET
关注(0)|答案(7)|浏览(279)

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

ijxebb2r1#

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

y1aodyip

y1aodyip2#

当您的Razor程式码中有ViewBagNon-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无法在正确的行中显示错误。
通常这会浪费很多时间。

eblbsuwk

eblbsuwk3#

使用反映动态更新不存在的属性时,也会掷回这个例外状况。
如果使用反射来动态更新属性值,则值得检查以确保传递的PropertyName与实际属性相同。
在我的例子中,我试图更新Employee.firstName,但是属性实际上是Employee.FirstName
值得记住。:)

bkhjykvo

bkhjykvo4#

我解决这个错误的方法是从另一个引用了@Model.Id的项目中复制粘贴。这个特定的页面没有一个模型,但是错误行离实际的错误太远了,我从来没有发现过它!

dffbzjpn

dffbzjpn5#

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

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

dldeef676#

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

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

jmp7cifd7#

设定

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

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

相关问题