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

时间:2014-04-09 18:28:57

标签: 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>

如果此强类型视图的控制器定义为

    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表达式。

1 个答案:

答案 0 :(得分:2)

@model BloombergGUI.Models.SecurityViewAltModel

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

当你做

 return View(); 

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

当你做

return View(new SecurityViewAltModel());

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

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

m => m.FieldsListModel.FieldsList

<强>详细信息:

  1. 在评估表达式时,可以检查哪些将阻止空引用。
  2. 在MVC DLL内部,当处理Expression时,它具有如下逻辑:

  3. 使用参数 viewData.Model 对象评估表达式的值。

  4. 电话如下:

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

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