我有两个编辑器模板:一个用于十进制,一个用于十进制? (可为空)
但是,当我的模型中有可为空的十进制时,它将尝试加载普通的十进制编辑器:
<%: Html.EditorFor(model => model.SomeDecimal )%>
<%: Html.EditorFor(model => model.SomeNullableDecimal )%>
第一个可以正常工作,并加载十进制编辑器模板。第二个也尝试加载十进制模板(并且失败,因为它不是十进制字段)。
错误消息是:
The model item passed into the dictionary is null, but this dictionary requires
a non-null model item of type 'System.Decimal'.
我的模板声明如下:
十进制模板:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal>" %>
可空的十进制模板:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>
我知道我可以通过传入模板名称来使其工作,例如
但是我真的希望它像所有其他模板一样使用类型自动运行。
<%: Html.EditorFor(model => model.SomeNullableDecimal,
"NullableDecimalTemplate" )%>
最佳答案
感谢Bryan添加赏金以尝试获得积极的解决方案,但我将不得不回答并说我已经找到了答案,绝对是不可能的-您不能从其类型中自动发现可为空的模板。您必须使用模板名称。
这是Brad Wilson博客http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html中的相关报价。他是MVC的权威人士,所以当他说:
他还继续说
是的,这个问题有答案,但是不幸的是,答案是“否”。
要使用可为空的模板,您必须明确使用模板名称:
<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>
或者,您可以使用一个同时处理可为null和不可为null的类型的模板:
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>