ASP.NET в MVC 2 в формате HTML.EditorFor для типа nullable?

у меня есть два шаблона редактора: один для decimal и один для decimal? (nullable)

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

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

Nullable десятичный шаблон:

<%@ Control Language="C#" 
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>

Я знаю, что могу заставить его работать, передав имя шаблона, например

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

<%: Html.EditorFor(model => model.SomeNullableDecimal, 
"NullableDecimalTemplate" )%>

5 ответов


спасибо Брайану за добавление щедрости, чтобы попытаться получить положительное решение, но я собираюсь ответить и сказать, что я обнаружил, что ответ Определенно нет - у вас не может быть обнуляемого шаблона, автоматически обнаруженного из его типа. Необходимо использовать имя шаблона.

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

при поиске имени типа используется простое имя (т. е. тип.Имя) без пространства имен. Кроме того, если тип является недействительным, мы ищем T (so вы получите логический шаблон используете ли вы "bool" или "Nullable")

Он также продолжает говорить

Это означает, что если вы пишете шаблоны для типов значений необходимо приходится ли значение таковыми или не. Вы можете использовать Собственность IsNullableValueType из ModelMetadata, чтобы определить, значение null. Мы увидим пример ниже с встроенный логический шаблон.

Так что да есть ответ на этот вопрос, но, к сожалению, ответ нет.

чтобы использовать шаблон с нулевым значением, вы должны явно использовать имя шаблона:

<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>

или вы можете использовать один шаблон, который обрабатывает как nullable и non nullable тип:

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

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

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

Если вам нужны дополнительные сведения, посмотрите здесь: http://www.campusmvp.net/blog/asp-net-mvc-editorfor-for-nullable-propierties


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


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

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

подробности этот блог


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

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