代码之家  ›  专栏  ›  技术社区  ›  Dave Archer

.NET MVC VIEWPAGE<T1>和VIEWUserControl<T2>行为

  •  0
  • Dave Archer  · 技术社区  · 15 年前

    我有一个视图页,继承部分看起来像

    Inherits="System.Web.Mvc.ViewPage<User>"
    

    以及一个viewUserControl,其继承部分看起来像

    Inherits="System.Web.Mvc.ViewUserControl<Address>
    

    其中,用户类(简称)基本上是这样的:

    class User {
    public virtual Address address { get; set; }
    

    }

    现在,如果我尝试:

    Html.RenderPartial("Address", Model.address);
    

    然后我可能会有一些奇怪的行为。在我的例子中,结果发现model.address为空,而不是向控件传递空值,看起来框架试图传递模型(即type=user),并抛出了一个错误(意外类型)。

    忽略我的地址为空的事实,是默认为父对象的行为是一个错误,或者预期的行为。如果这是预期行为,那么有人能解释为什么吗?我不明白。

    2 回复  |  直到 15 年前
        1
  •  1
  •   BFree    15 年前

    通常,这些问题会导致操作在其他地方出错,而错误是不可复制的。我试图重现你的真实场景,你知道什么?实际上你是对的:)我创建了一个简单的父子关系,并让视图的类型为child,类型为child的一部分。parent为空,我没有得到空引用,实际上我得到了类型不匹配错误。实际上,即使显式地向视图传递了空值:

    Html.RenderPartial("MyPartial",null);
    

    或者即使是直接演员:

    Html.RenderPartial("MyPartial",(Parent)null);
    

    它仍然会产生失配错误。

    我的 猜测 这实际上是一个总的猜测,当它检测到被传递的对象为空时,它默认使用实际视图本身的模型。我不确定这是设计还是错误,但这是唯一有意义的。

        2
  •  0
  •   eu-ge-ne    15 年前

    我相信 您应该避免向视图传递空模型 . 如果模型为空,则使用默认/空模型。这应该有效:

    Html.RenderPartial("Address", Model.address ?? new Address { /* OPTIONAL: default values */});