【问题标题】:.net mvc ViewPage<T1> and ViewUserControl<T2> behaviour.net mvc ViewPage<T1> 和 ViewUserControl<T2> 行为
【发布时间】:2009-06-16 12:17:57
【问题描述】:

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

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

和一个 ViewUserControl 的继承部分看起来像

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

User 类(缩短)基本上如下所示:

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

}

现在,如果我尝试:

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

然后我可能会得到一些奇怪的行为。在我的例子中,原来 Model.address 是 null 而不是将 null 传递给控件,​​看起来框架试图传递 Model(即 type=User)并抛出错误(意外类型)。

忽略我的地址为空的事实,将父对象默认为错误或预期行为的行为。如果这是预期的行为,那么有人可以解释为什么吗?没看懂。

【问题讨论】:

    标签: c# .net model-view-controller user-controls


    【解决方案1】:

    这类问题通常会导致 OP 在其他地方出错,并且该错误无法重现。我尝试重新创建您的确切场景,您知道什么?你实际上是对的 :) 我创建了一个简单的父/子关系,并且 View 的类型为子类型,并且部分类型为 child.Parent,它为空,我没有得到空引用,我确实做到了得到类型不匹配错误。事实上,即使明确地将 null 传递给视图:

    Html.RenderPartial("MyPartial",null);
    

    甚至直接演员:

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

    它仍然给出了不匹配错误。

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

    【讨论】:

    • 感谢您确认该行为。至少我现在知道它不仅仅是我。让我们希望有人有答案。 +1 表示您付出的努力:-)
    【解决方案2】:

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

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

    【讨论】:

    • 同意,但我更好奇它默认为“用户”模型的行为:-(
    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 2018-10-25
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2015-11-06
    • 2015-11-11
    相关资源
    最近更新 更多