我的观点已定义
@model BloombergGUI.Models.SecurityViewAltModel
<div class="col-md-10">
@Html.TextArea("TestArea",Model.FieldsList)
@Html.TextAreaFor(m => m.FieldsList, new {@class = "form-control"})
</div>
如果此强类型视图的控制器定义为
public ActionResult Index()
{
return View(); //The first Html.TextArea says Model.FieldList is null
}
如果它被定义为以下内容,那么视图中的两个语句都可以工作。
public ActionResult Index()
{
return View(new SecurityViewAltModel());
}
为什么当强类型视图时,Model.Property指示Model为null但是当我显式传递一个新模型()时,Model.Property工作正常。我认为Model只是访问视图的强类型模型的另一种方式,m =&gt; m.property是用于强类型视图的TextBoxFor扩展方法的lambda表达式。
答案 0 :(得分:2)
在
@model BloombergGUI.Models.SecurityViewAltModel
您在View中定义的实际上是来自控制器的强类型数据传递机制。
当你做
时 return View();
你应该得到一个NULL模型。这是因为没有数据传递给View。模型预计为空。
当你做
时return View(new SecurityViewAltModel());
发送非空模型对象,所有字段为null。 MVC将为这些空数据字段呈现空控件。
注意在第二种情况下,您可能无法获得Null引用异常,因为您没有处理直接的object.field引用,而是 Expression 。
m => m.FieldsList
与Model.FieldsList
<强>详细信息:强>
在MVC DLL内部,当处理Expression时,它具有如下逻辑:
使用参数 viewData.Model 对象评估表达式的值。
电话如下:
<强> CachedExpressionCompiler.Process<TParameter, TValue>(expression)(model);
强>
当时,它进入 FingerprintingExpressionVisitor ,它可以处理null Model并返回null响应,以便Extension Helper不呈现任何数据。