使用: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)
找到解决方案:我认为有拼写错误,ViewBag.Typo <-- this caused the error, but the debugger placed the exception at a irrelevant place.
当您的 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 无法在正确的行中显示错误。
通常这会浪费很多时间。
使用反射动态更新不存在的属性时也会引发此异常。
如果使用反射来动态更新属性值,则值得检查以确保传递的
PropertyName
与实际属性相同。
就我而言,我试图更新
Employee.firstName
,但该属性实际上是Employee.FirstName
。
值得牢记。 :)
我对这个错误的解决方案是从另一个引用了
@Model.Id
的项目中复制并粘贴。这个特定的页面没有有模型,但错误线与实际错误相去甚远,我几乎从未找到它!
与 Razor 无关,您会在运行时尝试访问动态值中不存在的属性时看到异常:
dynamic myValue;
if(myValue.notExistedProperty == "some-value") { ... }
您必须定义不等于 null 的状态..
@if (ViewBag.States!= null)
{
@foreach (KeyValuePair<int, string> de in ViewBag.States)
{
value="@de.Key">@de.Value
}
}
与 Ravor 无关,但是就我而言,在运行单元测试时不断收到此错误。
幸运的是,经过进一步调查,这就是空引用错误的原因。
背景:我正在添加一个新的配置文件,并想为此编写一些测试。我也在测试项目中添加了这个配置文件。由于某种原因,.NET 单元测试无法在运行时解析期间选取此文件。可能是,该文件在
bin
目录中不可用,或者 obj
文件夹未刷新。
为了解决这个问题,我必须删除我的
bin
obj
文件夹并重建项目 - 这似乎有效。
.NET 单元测试和 MSBuild 能够成功获取文件夹中的文件,并能够将其绑定到我的模型类并解析(配置文件到我的模型映射)
设置
Dictionary<int, string> states = new Dictionary<int, string>()
作为函数外部的属性并在函数内部插入条目,它应该可以工作。