我有两个编辑器模板:一个十进制,一个是十进制?(无效)

但是当我在模型中有一个可空的十进制时,它试图加载正常的十进制编辑器:

<%: 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上的权威来源,所以当他说的时候,我必须相信他:

在搜索类型名称时, 使用简单的名称(即,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; }
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top