繁体   English   中英

当控制器未明确传递给强类型视图时,视图模型为空

[英]View Model Null when not explicitly passed by controller to strongly typed view

我的观点是定义的

    @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 => m.property是用于强类型视图的TextBoxFor扩展方法的lambda表达式。

@model BloombergGUI.Models.SecurityViewAltModel

您在View中定义实际上是来自控制器的强类型数据传递机制。

当你这样做

 return View(); 

你应该得到一个NULL模型。 这是因为没有数据传递给View。 模型预计为空。

当你这样做

return View(new SecurityViewAltModel());

发送非null Model对象,所有字段为null。 MVC将为这些空数据字段呈现空控件。

请注意 ,在第二种情况下,您可能无法获得Null引用异常,因为您没有处理直接的object.field引用,而是处理Expression

m => m.FieldsListModel.FieldsList

细节:

  1. 在计算表达式时,可以进行检查以防止空引用。
  2. 在MVC DLL内部,当处理Expression时,它具有如下逻辑:

  3. 使用Parameter评估表达式的值作为viewData.Model对象。

电话如下:

CachedExpressionCompiler.Process<TParameter, TValue>(expression)(model);

在那时,它进入FingerprintingExpressionVisitor并且它可以处理null Model并返回null响应以使Extension Helper不呈现任何数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM