时间:2010-07-24 03:54:17

标签: c# asp.net-mvc asp.net-mvc-2 mvc-editor-templates editortemplates

5 个答案:

答案 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; }