MVC:Nullable <t> </t>类型的模型

时间:2010-05-15 17:14:59

标签: c# .net asp.net-mvc

我有一个部分视图,它继承自ViewUserControl<Guid?> - 即它的模型属于Nullable<Guid>类型。很简单的看法,没什么特别的,但那不是重点。

在其他地方,我Html.RenderPartial( "MyView", someGuid ),其中someGuid的类型为Nullable<Guid>。一切都是完全合法的,应该工作正常,对吗?

但是这里有问题:Html.RenderPartial的第二个参数是object类型,因此,Nullable<Guid>是值类型,必须加框。但是可空类型在CLR中以某种方式特殊,因此当你装入其中一个时,实际上你得到一个类型为T的盒装值(Nullable的参数),或者如果是nullable没有开始的价值。而最后一个案例实际上很有趣。

事实证明,有时,someGuid.HasValue == false确实存在这种情况。在这种情况下,我有效地接到了电话Html.RenderPartial( "MyView", null )。当模型为null时,HtmlHelper会做什么?信不信由你,它只是继续前进并采用父视图的模型。无论它的类型如何。

所以,当然,在这些情况下,我得到一个异常说:“传递到字典中的模型项是'Parent.View.Model.Type'类型,但是这个字典需要一个'System'类型的模型项。 GUID?'“

所以问题是:如何让MVC正确传递new Nullable<Guid> { HasValue = false }而不是试图抓住父模型?

注意:我确实考虑将我的Guid?包装在另一种类型的对象中,专门为此场合创建,但这看起来非常荒谬。只要有另一种方式,就不要这样做。

注意2 :既然我已经写了这一切,我已经意识到这个问题可能会被简化为如何为模型传递null而不用父模型?

1 个答案:

答案 0 :(得分:2)

<% Html.RenderPartial("MyView", someGuid ?? new Guid()); %>

更新:

使用ASP.NET MVC 2.0中的编辑器和/或显示模板,您可以获得所需的结果。将Guid.ascx文件放在Shared/EditorTemplates文件夹中,并将其包括在内:

<%= Html.EditorFor(x => someGuid) %>

或者guid是主模型的属性:

<%= Html.EditorFor(x => x.SomeGuid) %>

现在,如果您在部分内部放置<%= Model.HasValue %>,则可以获得false但不能使用RenderPartial