我有一个部分视图,它继承自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而不用父模型?
答案 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
。