Вопрос

У меня есть два шаблона редактора: один для десятичных и один для десятичных?(NULLBAL)

Но когда у меня есть ненужные десятичные десятичные в мою модели, он пытается загрузить нормальный десятичный редактор:

<%: 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 за добавление щедрости, чтобы попытаться получить положительное решение, но мне придется ответить и сказать, что я обнаружил, что ответ определенно нет - вы не можете иметь оттудачный шаблон автоматически открытый из его тип. Вы должны использовать имя шаблона.

Это соответствующая цитата из блога Брэда Уилсона в http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc---templates-part-3-default-templates.html . Он является авторитетным источником на MVC, поэтому я должен поверить ему, когда он говорит:

При поиске имени типа Простое имя используется (I.e., type.name) без пространства пространства. Кроме того, если тип ненужно, мы ищем T (так Вы получите логический шаблон используете ли вы «Bool» или «NULLBALE»)

Он также продолжает сказать

Это означает, что если вы пишете шаблоны для типов ценностей вам нужно будет приходится ли значение ненужные или нет. Вы можете использовать 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" })%>
<% } %>
.

Другие советы

Чтобы создать шаблон для Nullable Type, вы называете свой шаблон в качестве типа базового значения, а затем создаете шаблон редактора с Nullable Model.

Например, я хочу сделать шаблон для INT?.Я создал редактор шаблон с именем «int32.cshtml», и я использую int?как модель.

Шаблон должен быть назван "Nullable`1".Поскольку это будет соответствовать любой изнурительной структуре, вы можете сделать переключатель в типе модели и рендерировать соответствующий частичный шаблон на основе типа из типа «NULLBALE» ASCXX »

Нет способа сделать это так, как вы хотите.Может быть только один шаблон для десятичных и десятичных детей?Но вы можете определить в шаблоне, если значение прошло, имеет значение NULLBALE, как это:

<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
.

Для более подробной информации о проверке Этот блог пост

Да, вы можете сделать это без указания шаблона в HTML.Editorfor, но тогда вам нужно указать шаблон против Nullbable свойств с использованием атрибута Uihint.

[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top