Как переопределить строковое представление, используемое вспомогательными методами HTML для свойств модели? - PullRequest
2 голосов
/ 17 сентября 2008

Вспомогательные методы html проверяют значение в ViewDataDictionary. Значение может быть либо в словаре, либо в модели, как свойство. Чтобы извлечь значение, внутренний запечатанный класс с именем ViewDataEvaluator использует PropertyDescriptor для получения значения. Затем вызывается Convert.ToString () для преобразования возвращаемого объекта в строку.

Желаемый код в действии контроллера

Действие контроллера должно заполнять только модель, а не форматировать ее (форматирование модели глобально).

Желаемый код в View

Представление может отображать текстовое поле HTML и извлекать строковое представление свойства с помощью этой строки кода:

<%=Html.TextBox(“Date”) %>
<%=Html.TextBox(“Time”) %>
<%=Html.TextBox(“UnitPrice”) %>

Привязка свойства модели к HtmlHelper.TextBox ()

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

Например, мне нужно отформатировать десятичную точность UnitPrice в зависимости от рынка.

string decimalPlaces = ViewData.Model.Precision.ToString ();
<%=Html.TextBox(“UnitPrice”, ViewData.Model.TypeName.UnitPrice.ToString("N" + decimalPlaces)) %>

2-сторонняя привязка данных, пожалуйста

Так же, как IModelBinder является Parse для каждого свойства модели, мне нужно Формат для каждого свойства, вроде Windows Forms привязка , но на основе модели вместо контроля. Это позволило бы модели совершить круговую передачу и иметь правильное форматирование. Я бы предпочел дизайн, где я мог бы переопределить форматирование по умолчанию. Кроме того, моя модель находится в отдельной сборке, поэтому атрибуты, указывающие форматер, не являются опцией.

Обратите внимание, что мне нужно форматирование, специфичное для свойства для модели, а не форматирование, специфичное для типа .

1 Ответ

3 голосов
/ 17 сентября 2008

Нет способа указать формат с помощью самих помощников. Подход, который вы выбрали, сработает. Другой подход заключается в добавлении значения, предварительно отформатированного в ModelState.

РЕДАКТИРОВАТЬ : Вы уверены, что хотите форматировать текстовый ввод с валютой? Например, то, что вы видите на входе:

<input type="text" name="UnitPrice" value="$1.23" />

Когда вы отправите это обратно на сервер, мы этого не поймем. Вместо этого я бы поставил символ валюты вне ввода текста. Например:

$<%= Html.TextBox("UnitPrice") %>

Я уверен, что есть простой способ отрисовки "$" без жесткого кодирования, так что он локализуется, но я не знаю, что это не так

ИЗМЕНИТЬ СНОВА Комментарий от разработчика в моей команде:

Ну, если честно, это не так уж и плохо. Часто, когда вы форматируете число или дата это все еще понятно грядущее обратно. Например, заполнение номер (например, почтовый индекс) до 5 цифр, дополнить десятичными до сотых долей, форматирование даты в формате гггг-мм-дд, и т. д. придет просто отлично. Добавление дополнительные символы, такие как символы валюты сломается, но обычно поля ввода не брать и не отображать символы валюты в любом случае - это подразумевается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...