C# 当控制器未显式传递给强类型视图时,视图模型为Null
我的观点是明确的C# 当控制器未显式传递给强类型视图时,视图模型为Null,c#,asp.net-mvc,model-view-controller,C#,Asp.net Mvc,Model View Controller,我的观点是明确的 @model BloombergGUI.Models.SecurityViewAltModel <div class="col-md-10"> @Html.TextArea("TestArea",Model.FieldsList) @Html.TextAreaFor(m => m.FieldsList, new {@class = "form-control"}) </div> 如果定义如
@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(new SecurityViewAltModel());
}
为什么当视图是强类型视图时是Model.Property指示Model为null,但当我显式传递一个新Model()时,Model.Property工作正常。我认为Model只是访问视图的强类型模型的另一种方式,m=>m.property是用于强类型视图的TextBoxFor扩展方法的lambda表达式
@model BloombergGUI.Models.SecurityViewAltModel
您在视图中定义的实际上是来自控制器的强类型数据传递机制
当你这样做的时候
return View();
return View(new SecurityViewAltModel());
你应该得到一个空模型。这是因为没有数据被传递到视图。模型应为空
当你这样做的时候
return View();
return View(new SecurityViewAltModel());
发送非null模型对象时,所有字段均为null。MVC将为这些空数据字段呈现空控件
注意在第二种情况下,您可能不会得到Null reference异常,因为您处理的不是直接的object.field引用,而是表达式
m=>m.FieldsList
vs.Model.FieldsList
详细信息:
CachedExpressionCompiler.Process(表达式)(模型)代码>
此时,它进入指纹表达式访问者,它可以处理空模型,并为扩展助手返回空响应,使其不呈现任何数据。给回答问题的两个人。。。如果return View()将空模型传递回视图,那么为什么第二个textboxfor still渲染。如果我去掉@Html.TextArea(“testrea”,Model.FieldsList),页面就会呈现得很好。如果Model为null,那么m=>m.FieldsList是否也会失败?这是因为存在差异。。当我试图执行CachedExpressionCompiler.Process(expression)(model)时编辑了我的anser;在调试期间,在TextBoxFor行上设置了断点的情况下,即时窗口中的行表示“当前上下文中不存在名称‘CachedExpressionCompiler’”,这是一个内部MVC DLL调用。你不能叫它。我只是解释了为什么null模型对象不抛出异常的细节。当它计算m.Fields表达式时,它向上走表达式,发现m本身为null。因此,表达式被回避以返回明渠!好的,很抱歉误解了。谢谢