ASP.NET MVC 2 - HTML.EDITERFORS一种可用的类型?
-
28-09-2020 - |
题
我有两个编辑器模板:一个十进制,一个是十进制?(无效)
但是当我在模型中有一个可空的十进制时,它试图加载正常的十进制编辑器:
<%: 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" )%>
. 解决方案
这是Brad Wilson博客的相关报价 http://bradwilson.typepad.com/blog/2009/10/Aspnet-mvc-2-templates-part-3-default-templates.html 。他是MVC上的权威来源,所以当他说的时候,我必须相信他:
在搜索类型名称时, 使用简单的名称(即,type.name) 没有命名空间。此外,如果类型 是可录制的,我们搜索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" })%>
<% } %>
. 其他提示
为了为空白类型创建模板,您将模板命名为基本值类型,然后使用可空型号创建编辑器模板。
例如,我想为int做模板?我创建了一个名为“int32.chtml”的编辑器模板,我正在使用int?作为模型。
模板必须名为“NULLable`1”。由于这将匹配任何可用的结构,因此您可以在模型类型上执行开关,并根据“空白”中的类型,呈现相应的部分模板。
无法以您想要的方式执行此操作。十进制和十进制只能有一个模板?但是如果传递的值是如下可用类型的值,则可以确定模板中:
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
.
有关详细信息,请检查这个博客文章
是,您可以在不指定HTML.EDITITET中的模板,但随后,您需要使用UIHINT属性指定针对空的属性的模板。
[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
.