ASP.NET MVC 2 - HTML.Editor для обнуляемого типа? - PullRequest
12 голосов
/ 24 июля 2010

У меня есть два шаблона редактора: один для десятичной, а другой для десятичной?(nullable)

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

<%: 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" )%>

Ответы [ 5 ]

16 голосов
/ 15 марта 2011

Спасибо Брайану за добавление награды за попытку получить положительное решение, но мне придется ответить и сказать, что я нашел, что ответ определенно НЕТ - вы не можете иметь автоматически обнаруживаемый шаблон из его тип. Вы должны использовать имя шаблона.

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

При поиске имени типа используется простое имя (т.е. Type.Name) без пространства имен. Кроме того, если тип Nullable, мы ищем T (так вы получите логический шаблон используете ли вы «bool» или «Nullable»)

Он также продолжает:

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

Чтобы создать шаблон для типа, допускающего значение NULL, вы называете шаблон в качестве типа базового значения, а затем создаете шаблон редактора с моделью NULL.

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

1 голос
/ 10 марта 2011

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

0 голосов
/ 11 января 2017

Да, вы можете сделать это без указания шаблона в Html.EditorFor, но тогда вам нужно указать шаблон для свойства nullable с помощью атрибута UIhint.

[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
0 голосов
/ 14 февраля 2011

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

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

Для получения более подробной информации проверьте этот пост

...