答案 0 :(得分:16)
感谢Bryan为了获得积极的解决方案而增加赏金,但我将不得不回答并说我发现答案绝对没有 - 你不能从自动发现的可自由发现的模板它的类型。您必须使用模板名称。
这是Brad Wilson博客http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html的相关引用。他是MVC的权威来源,所以当他说:
时,我必须相信他搜索类型名称时, 使用简单名称(即Type.Name) 没有命名空间另外,如果是这种类型 是Nullable,我们搜索T(所以 你会得到布尔模板 你是否正在使用“bool”或 “可空”)
他还接着说
这意味着如果您正在编写模板 对于值类型,您需要 说明价值是否为 可空或不可空。你可以使用 IsNullableValueType属性 ModelMetadata确定是否 值可以为空。我们会看到一个 下面的例子与 内置布尔模板。
所以肯定有这个问题的答案,但遗憾的是答案是否定的。
要使用可以为空的模板,您必须明确使用模板名称:
<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>
或者您可以使用一个处理可空和非可空类型的模板:
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
答案 1 :(得分:2)
要为可为空的类型创建模板,请将模板命名为基值类型,然后使用可为空的模型创建编辑器模板。
例如,我想为int做一个模板?我创建了一个名为“int32.cshtml”的编辑器模板,我正在使用int?作为模型。
答案 2 :(得分:1)
模板必须命名为“Nullable`1”。由于这将匹配任何Nullable结构,您可以在模型类型上进行切换,并根据“Nullable .1.ascx”中的类型呈现相应的部分模板
答案 3 :(得分:0)
没有办法按照你想要的方式去做。十进制和十进制只能有一个模板?但是你可以在模板中确定传入的值是否为可空类型,如下所示:
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
有关详细信息,请查看this blog post
答案 4 :(得分:0)
是的,您可以在不指定Html.EditorFor中的模板的情况下执行此操作,但是您需要使用UIhint属性针对nullable属性指定模板。
[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }