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

详细信息:

  • 在对表达式求值时,可以进行一些检查以防止空引用
  • 在MVC DLL的深处,当处理表达式时,它具有如下逻辑:

  • 评估表达式的值,参数为viewData.Model对象

  • 电话如下:

    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。因此,表达式被回避以返回明渠!好的,很抱歉误解了。谢谢